//////////////////////////////////////////////////////////////////////////////// /** \file \brief \ru Сериализация SArray. \en Serialization of SArray. \~ */ //////////////////////////////////////////////////////////////////////////////// #ifndef __TEMPL_S_ARRAY_RW_H #define __TEMPL_S_ARRAY_RW_H #include #include #include #include #include //------------------------------------------------------------------------------ /**\ru Чтение массива из потока в объект. \en Reading of array from a stream to an object \~ \ingroup Base_Tools_Containers */ // template reader & operator >> ( reader & in, SArray & ref ) { ref.Flush(); if ( in.good() ) { size_t count = ReadCOUNT( in, true/*uint_val*/ ); if ( in.good() && count ) { size_t sizeOfType = sizeof(Type); // \ru половина адресного пространства для 32-разрядного приложения \en a half of address space for 32-bit application if ( ::TestNewSize( sizeOfType, count ) ) { ref.SetSize( count, true/*clear*/ ); C3D_ASSERT( ref.upper >= count ); if ( ref.GetAddr() != nullptr ) { size_t i; for ( i = 0; i < count && in.good(); i++ ) { in >> ref.parr[i]; ref.count++; // \ru были записаны не все данные (при условии что запись массива эмулировалась, \en not all data has been written (in condition that writing of array was emulated, // \ru писалось не через operator << (writer& out, const PArray& ref) ) \en it was written without the operator << (writer& out, const PArray& ref) ) if ( in.eof() ) // \ru вычитали-ли весь файл и ничего не осталось \en the whole file was read and nothing is left break; // for } } else { ref.SetSize( 0, true/*clear*/ ); C3D_ASSERT_UNCONDITIONAL( false ); in.setState( io::fail ); // \ru ошибка чтения \en reading error } } else in.setState( io::fail ); // \ru ошибка чтения \en reading error } } return in; } //------------------------------------------------------------------------------ /**\ru Запись массива в поток из объекта. \en Writing of array from an object to a stream. \~ \ingroup Base_Tools_Containers */ // --- template writer& operator << ( writer& out, const SArray& ref ) { //OV_x64 out << ref.count; WriteCOUNT( out, ref.count ); for( size_t i = 0; i < ref.count && out.good(); i++ ) out << ref.parr[i]; return out; } //------------------------------------------------------------------------------ /**\ru Чтение массива из потока в указатель. \en Reading of array from a stream to a pointer. \~ \ingroup Base_Tools_Containers */ // template reader& operator >> ( reader& in, SArray*& ptr ) { ptr = nullptr; if ( in.good() ) { if ( in.MathVersion() < 0x06000012L ) ptr = new SArray; else { uint8 existPtr; in >> existPtr; if ( existPtr ) ptr = new SArray; } if ( ptr ) in >> *ptr; // \ru чтение тела \en reading of a solid } return in; } //------------------------------------------------------------------------------ /**\ru Запись массива в поток из указателя. \en Writing of array from a pointer to a stream. \~ \ingroup Base_Tools_Containers */ // --- template writer& operator << ( writer& out, const SArray* ptr ) { // \ru ЯТ К6 при записи в старую версию оставляю без проверки указателя \en ЯТ К6 while writing to an old version the pointer is not checked if ( out.MathVersion() < 0x06000012L ) { C3D_ASSERT( ptr ); out << *ptr; } else { uint8 existPtr = !!ptr; out << existPtr; if ( existPtr ) out << *ptr; // \ru запись телом \en writing by a solid } return out; } //------------------------------------------------------------------------------ /**\ru Чтение массива из потока в объект. \en Reading of array from a stream to an object. \~ \ingroup Base_Tools_Containers */ // template reader & operator >> ( reader& in, SSArray& ref ) { return in >> (SArray &)ref; } //------------------------------------------------------------------------------ /**\ru Запись массива в поток из объекта. \en Writing of array from an object to a stream. \~ \ingroup Base_Tools_Containers */ // --- template writer& operator << ( writer& out, const SSArray& ref ) { return out << (const SArray &)ref; } //------------------------------------------------------------------------------ /**\ru Чтение массива из потока в объект. \en Reading of array from a stream to an object. \~ \ingroup Base_Tools_Containers */ // template reader & operator >> ( reader& in, CSSArray& ref ) { in >> (SSArray &)ref; int b; in >> b; ref.m_sort = !!b; //OV_x64 in >> ref.sort; return in; } //------------------------------------------------------------------------------ /**\ru Запись массива в поток из объекта. \en Writing of array from an object to a stream. \~ \ingroup Base_Tools_Containers */ // --- template writer& operator << ( writer& out, const CSSArray& ref ) { out << (const SSArray &)ref; int b = !!ref.m_sort; out << b; //OV_x64 out << ref.sort; return out; } //------------------------------------------------------------------------------ /**\ru Чтение массива из потока в объект. \en Reading of array from a stream to an object. \~ \ingroup Base_Tools_Containers */ // template reader & operator >> ( reader& in, IMArray& ref ) { // \ru OV x64 return in >> (SArray &)ref; // ЯТ К6 не Type, а uint !!! \en OV x64 return in >> (SArray &)ref; // ЯТ К6 not Type, but uint !!! if ( in.good() ) { size_t count = ReadCOUNT( in, true/*uint_val*/ ); if ( in.good() && count ) { ref.SetSize( count, true/*clear*/ ); for ( size_t i = 0; i < count && in.good(); i++ ) { size_t item = ReadCOUNT( in ); //OV_x64 in >> ref.parr[i]; ((SArray &)ref).Add( item ); } } } return in; } //------------------------------------------------------------------------------ /**\ru Запись массива в поток из объекта. \en Writing of array from an object to a stream. \~ \ingroup Base_Tools_Containers */ // --- template writer& operator << ( writer& out, const IMArray& ref ) { // \ru OV x64 return out << (const SArray &)ref; // ЯТ К6 не Type, а uint !!! \en OV x64 return out << (const SArray &)ref; // ЯТ К6 not Type, but uint !!! WriteCOUNT( out, ref.count ); for( size_t i = 0; i < ref.count && out.good(); i++ ) WriteCOUNT( out, (size_t)ref(i) ); return out; } #endif // __TEMPL_S_ARRAY_RW_H