|
7 | 7 | #include <string> |
8 | 8 | #include <vector> |
9 | 9 | #include <unordered_map> |
10 | | -#include <iostream> |
11 | 10 |
|
12 | 11 | namespace csp |
13 | 12 | { |
@@ -669,69 +668,16 @@ class StructMeta : public std::enable_shared_from_this<StructMeta> |
669 | 668 | }; |
670 | 669 |
|
671 | 670 | template<typename T> |
672 | | -std::shared_ptr<typename StructField::upcast<T>::type> StructMeta::getMetaField(const char* fieldname, const char* expectedtype) { |
673 | | - std::cout << "\n=== getMetaField Debug ===\n"; |
674 | | - std::cout << "1. Looking for field: " << fieldname << "\n"; |
675 | | - |
676 | | - auto field_ = field(fieldname); |
677 | | - if(!field_) { |
678 | | - std::cout << "2. Field not found!\n"; |
679 | | - CSP_THROW(TypeError, "Struct type " << name() << " missing required field " << fieldname); |
680 | | - } |
681 | | - |
682 | | - std::cout << "2. Field found\n"; |
683 | | - std::cout << "3. Field name from object: " << field_->fieldname() << "\n"; |
684 | | - std::cout << "4. Field type from CspType: " << field_->type()->type() << "\n"; |
685 | | - std::cout << "5. Expected type: " << CspType::Type::fromCType<T>::type << "\n"; |
686 | | - |
687 | | - // Memory layout & pointer checks |
688 | | - const StructField* field_ptr = field_.get(); |
689 | | - std::cout << "6. Field ptr value: " << field_ptr << "\n"; |
690 | | - std::cout << "7. Field use count: " << field_.use_count() << "\n"; |
691 | | - |
692 | | - // Detailed field information |
693 | | - if(field_ptr) { |
694 | | - std::cout << "8. Field metadata:\n"; |
695 | | - std::cout << " - Field offset: " << field_ptr->offset() << "\n"; |
696 | | - std::cout << " - Field size: " << field_ptr->size() << "\n"; |
697 | | - std::cout << " - Field alignment: " << field_ptr->alignment() << "\n"; |
698 | | - std::cout << " - Field mask offset: " << field_ptr->maskOffset() << "\n"; |
699 | | - std::cout << " - Field mask bit: " << static_cast<int>(field_ptr->maskBit()) << "\n"; |
700 | | - |
701 | | - // Type verification |
702 | | - std::cout << "9. Type checks:\n"; |
703 | | - std::cout << " - Original type: " << typeid(field_).name() << "\n"; |
704 | | - std::cout << " - Target type: " << typeid(typename StructField::upcast<T>::type).name() << "\n"; |
705 | | - std::cout << " - Is native: " << field_ptr->isNative() << "\n"; |
706 | | - |
707 | | - // Test various casts |
708 | | - std::cout << "10. Detailed cast tests:\n"; |
709 | | - std::cout << " Base classes:\n"; |
710 | | - std::cout << " - As StructField*: " << (dynamic_cast<const StructField*>(field_ptr) != nullptr) << "\n"; |
711 | | - std::cout << " - As NonNativeStructField*: " << (dynamic_cast<const NonNativeStructField*>(field_ptr) != nullptr) << "\n"; |
712 | | - std::cout << " Non-native implementations:\n"; |
713 | | - std::cout << " - As StringStructField*: " << (dynamic_cast<const StringStructField*>(field_ptr) != nullptr) << "\n"; |
714 | | - std::cout << " - As DialectGenericStructField*: " << (dynamic_cast<const DialectGenericStructField*>(field_ptr) != nullptr) << "\n"; |
715 | | - std::cout << " - As ArrayStructField<std::string>*: " << (dynamic_cast<const ArrayStructField<std::vector<std::string>>*>(field_ptr) != nullptr) << "\n"; |
716 | | - std::cout << " Native field test:\n"; |
717 | | - std::cout << " - As NativeStructField<int64_t>*: " << (dynamic_cast<const NativeStructField<int64_t>*>(field_ptr) != nullptr) << "\n"; |
718 | | -} |
719 | | - |
720 | | - using TargetType = typename StructField::upcast<T>::type; |
721 | | - auto typedfield = std::dynamic_pointer_cast<TargetType>(field_); |
722 | | - std::cout << "11. Final dynamic_cast result: " << (typedfield ? "success" : "failure") << "\n"; |
| 671 | +std::shared_ptr<typename StructField::upcast<T>::type> StructMeta::getMetaField( const char * fieldname, const char * expectedtype ) |
| 672 | +{ |
| 673 | + auto field_ = field( fieldname ); |
| 674 | + if( !field_ ) |
| 675 | + CSP_THROW( TypeError, "Struct type " << name() << " missing required field " << fieldname << " for " << expectedtype ); |
723 | 676 |
|
724 | | - if(!typedfield) { |
725 | | - std::cout << "12. FAILED CAST DETAILS:\n"; |
726 | | - std::cout << " - Source type: " << typeid(StructField).name() << "\n"; |
727 | | - std::cout << " - Target type: " << typeid(TargetType).name() << "\n"; |
728 | | - |
729 | | - CSP_THROW(TypeError, expectedtype << " - provided struct type " << name() |
730 | | - << " expected type " << CspType::Type::fromCType<T>::type |
731 | | - << " for field " << fieldname |
732 | | - << " but got type " << field_->type()->type() |
733 | | - << " for " << expectedtype); |
734 | | - } |
| 677 | + std::shared_ptr<typename StructField::upcast<T>::type> typedfield = std::dynamic_pointer_cast<typename StructField::upcast<T>::type>( field_ ); |
| 678 | + if( !typedfield ) |
| 679 | + CSP_THROW( TypeError, expectedtype << " - provided struct type " << name() << " expected type " << CspType::Type::fromCType<T>::type << " for field " << fieldname |
| 680 | + << " but got type " << field_ -> type() -> type() << " for " << expectedtype ); |
735 | 681 |
|
736 | 682 | return typedfield; |
737 | 683 | } |
@@ -827,31 +773,22 @@ class Struct |
827 | 773 | friend class StructMeta; |
828 | 774 |
|
829 | 775 | //Note these members are not included on size(), they're stored before "this" ptr ( see operator new / delete ) |
830 | | - struct alignas(8) HiddenData { |
831 | | - alignas(8) size_t refcount; // 8 bytes at 0x0 |
832 | | - alignas(8) std::shared_ptr<const StructMeta> meta; // 16 bytes at 0x8 |
833 | | - alignas(8) void* dialectPtr; // 8 bytes at 0x18 |
834 | | - // Total: 32 bytes |
| 776 | + struct HiddenData |
| 777 | + { |
| 778 | + size_t refcount; |
| 779 | + std::shared_ptr<const StructMeta> meta; |
| 780 | + void * dialectPtr; |
835 | 781 | }; |
836 | 782 |
|
837 | 783 | const HiddenData * hidden() const |
838 | 784 | { |
839 | 785 | return const_cast<Struct *>( this ) -> hidden(); |
840 | 786 | } |
841 | 787 |
|
842 | | - static constexpr size_t HIDDEN_OFFSET = 32; // sizeof(HiddenData) aligned to 8 bytes |
843 | | - |
844 | | - HiddenData* hidden() { |
845 | | - std::byte* base = reinterpret_cast<std::byte*>(this); |
846 | | - // Force alignment to match shared_ptr requirements |
847 | | - static_assert(alignof(HiddenData) >= alignof(std::shared_ptr<void>), |
848 | | - "HiddenData must be aligned for shared_ptr"); |
849 | | - return reinterpret_cast<HiddenData*>(base - HIDDEN_OFFSET); |
850 | | - } |
851 | | - // HiddenData * hidden() |
852 | | - // { |
853 | | - // return reinterpret_cast<HiddenData *>( reinterpret_cast<uint8_t *>( this ) - sizeof( HiddenData ) ); |
854 | | - // } |
| 788 | + HiddenData * hidden() |
| 789 | + { |
| 790 | + return reinterpret_cast<HiddenData *>( reinterpret_cast<uint8_t *>( this ) - sizeof( HiddenData ) ); |
| 791 | + } |
855 | 792 |
|
856 | 793 | //actual data is allocated past this point |
857 | 794 | }; |
|
0 commit comments