inline.h 149 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085
  1. /******************************************************************************/
  2. inline Bool Any(C Half &x ) {return FlagTest(x.data , 0x7FFF);} // faster version of "x!=0"
  3. inline Bool Any(C Half &x, C Half &y ) {return FlagTest(x.data | y.data , 0x7FFF);} // faster version of "x!=0 || y!=0"
  4. inline Bool Any(C Half &x, C Half &y, C Half &z ) {return FlagTest(x.data | y.data | z.data , 0x7FFF);} // faster version of "x!=0 || y!=0 || z!=0"
  5. inline Bool Any(C Half &x, C Half &y, C Half &z, C Half &w) {return FlagTest(x.data | y.data | z.data | w.data, 0x7FFF);} // faster version of "x!=0 || y!=0 || z!=0 || w!=0"
  6. inline Bool Any(C Flt &x ) {return FlagTest((U32&)x , ~SIGN_BIT);} // faster version of "x!=0"
  7. inline Bool Any(C Flt &x, C Flt &y ) {return FlagTest((U32&)x | (U32&)y , ~SIGN_BIT);} // faster version of "x!=0 || y!=0"
  8. inline Bool Any(C Flt &x, C Flt &y, C Flt &z ) {return FlagTest((U32&)x | (U32&)y | (U32&)z , ~SIGN_BIT);} // faster version of "x!=0 || y!=0 || z!=0"
  9. inline Bool Any(C Flt &x, C Flt &y, C Flt &z, C Flt &w) {return FlagTest((U32&)x | (U32&)y | (U32&)z | (U32&)w, ~SIGN_BIT);} // faster version of "x!=0 || y!=0 || z!=0 || w!=0"
  10. inline Bool Any(C Dbl &x ) {return FlagTest((U64&)x , (~0ull)>>1);} // faster version of "x!=0"
  11. inline Bool Any(C Dbl &x, C Dbl &y ) {return FlagTest((U64&)x | (U64&)y , (~0ull)>>1);} // faster version of "x!=0 || y!=0"
  12. inline Bool Any(C Dbl &x, C Dbl &y, C Dbl &z ) {return FlagTest((U64&)x | (U64&)y | (U64&)z , (~0ull)>>1);} // faster version of "x!=0 || y!=0 || z!=0"
  13. inline Bool Any(C Dbl &x, C Dbl &y, C Dbl &z, C Dbl &w) {return FlagTest((U64&)x | (U64&)y | (U64&)z | (U64&)w, (~0ull)>>1);} // faster version of "x!=0 || y!=0 || z!=0 || w!=0"
  14. /******************************************************************************/
  15. inline Int AtomicGet(C Int &x ) {return x;}
  16. inline UInt AtomicGet(C UInt &x ) {return x;}
  17. inline Flt AtomicGet(C Flt &x ) {return x;}
  18. inline void AtomicSet( Int &x, Int y) {x=y ;}
  19. inline void AtomicSet( UInt &x, UInt y) {x=y ;}
  20. inline void AtomicSet( Flt &x, Flt y) {x=y ;}
  21. #if X64
  22. inline Long AtomicGet(C Long &x ) {return x;}
  23. inline void AtomicSet( Long &x, Long y) {x=y ;}
  24. #endif
  25. T1(TYPE) void AtomicSet(TYPE* &x, TYPE *y) {x=y;}
  26. /******************************************************************************/
  27. inline Str8::Str8 (Str8 &&s) {_length=0; Swap(T, s);}
  28. inline Str ::Str (Str &&s) {_length=0; Swap(T, s);}
  29. inline Str8& Str8::operator=(Str8 &&s) { Swap(T, s); return T;}
  30. inline Str & Str ::operator=(Str &&s) { Swap(T, s); return T;}
  31. inline Bool Str8::save(File &f)C {f.putStr(T); return f.ok();}
  32. inline Bool Str ::save(File &f)C {f.putStr(T); return f.ok();}
  33. inline Bool Str8::load(File &f) {f.getStr(T); return f.ok();}
  34. inline Bool Str ::load(File &f) {f.getStr(T); return f.ok();}
  35. /******************************************************************************/
  36. inline C TextNode* FindNodeC(C MemPtr<TextNode> &nodes, C Str &name, Int i) {return FindNode(ConstCast(nodes), name, i);}
  37. inline C XmlParam* XmlNode::findParam(C Str &name, Int i )C {return ConstCast(T ).findParam(name, i);}
  38. inline C TextNode* TextNode::findNode (C Str &name, Int i )C {return ConstCast(T ).findNode (name, i);}
  39. inline C TextNode* TextData::findNode (C Str &name, Int i )C {return ConstCast(T ).findNode (name, i);}
  40. /******************************************************************************/
  41. inline C TextParam* Edit::FileParams::findParam(C Str &name)C {return ConstCast(T).findParam(name);}
  42. /******************************************************************************/
  43. inline C SkelBone * Skeleton ::findBone ( BONE_TYPE type, Int type_index, Int type_sub)C {return ConstCast(T).findBone ( type, type_index, type_sub);}
  44. inline C SkelBone & Skeleton :: getBone ( BONE_TYPE type, Int type_index, Int type_sub)C {return ConstCast(T). getBone ( type, type_index, type_sub);}
  45. inline C SkelBone * Skeleton ::findBone (CChar8 *name, BONE_TYPE type, Int type_index, Int type_sub)C {return ConstCast(T).findBone (name, type, type_index, type_sub);}
  46. inline C SkelBone * Skeleton ::findBone (CChar8 *name )C {return ConstCast(T).findBone (name );}
  47. inline C SkelSlot * Skeleton ::findSlot (CChar8 *name )C {return ConstCast(T).findSlot (name );}
  48. inline C SkelBone & Skeleton :: getBone (CChar8 *name )C {return ConstCast(T). getBone (name );}
  49. inline C SkelSlot & Skeleton :: getSlot (CChar8 *name )C {return ConstCast(T). getSlot (name );}
  50. inline C AnimBone * Animation::findBone (CChar8 *name, BONE_TYPE type, Int type_index, Int type_sub)C {return ConstCast(T).findBone (name, type, type_index, type_sub);}
  51. inline C AnimEvent* Animation::findEvent(CChar8 *name )C {return ConstCast(T).findEvent(name );}
  52. /******************************************************************************/
  53. inline C Param* Object::findParam(C Str &name)C {return ConstCast(T).findParam(name);}
  54. inline C Param& Object:: getParam(C Str &name)C {return ConstCast(T). getParam(name);}
  55. /******************************************************************************/
  56. extern Bool _CompressBC7 (C Image &src, Image &dest);
  57. extern Bool (*CompressBC7)(C Image &src, Image &dest);
  58. inline void SupportCompressBC7() {CompressBC7=_CompressBC7;}
  59. extern Bool _CompressETC (C Image &src, Image &dest, Int quality=-1, Bool perceptual=true);
  60. extern Bool (*CompressETC)(C Image &src, Image &dest, Int quality , Bool perceptual );
  61. inline void SupportCompressETC() {CompressETC=_CompressETC;}
  62. extern Bool _CompressPVRTC (C Image &src, Image &dest, Int quality=-1);
  63. extern Bool (*CompressPVRTC)(C Image &src, Image &dest, Int quality );
  64. inline void SupportCompressPVRTC() {if(WINDOWS_OLD || MAC || LINUX)CompressPVRTC=_CompressPVRTC;}
  65. inline void SupportCompressAll() {SupportCompressBC7(); SupportCompressETC(); SupportCompressPVRTC();}
  66. /******************************************************************************/
  67. // STRING / TEXT
  68. /******************************************************************************/
  69. inline Char * TextPos(Char *src, Char c) {return ConstCast(TextPos((CChar *)src, c));}
  70. inline Char8* TextPos(Char8 *src, Char8 c) {return ConstCast(TextPos((CChar8*)src, c));}
  71. /******************************************************************************/
  72. // MATRIX
  73. /******************************************************************************/
  74. inline void Matrix3::mul(C RevMatrix3 &matrix, Matrix3 &dest)C {matrix.mul(T, dest);}
  75. inline void Matrix ::mul(C RevMatrix &matrix, Matrix &dest)C {matrix.mul(T, dest);}
  76. /******************************************************************************/
  77. // TEMPLATES
  78. /******************************************************************************/
  79. T1(TYPE) DISABLE_IF_ENUM(TYPE, Bool) InRange(Int i, C TYPE &container) {return UInt (i)<UInt (Elms(container));} // template specialization for not enum's
  80. T1(TYPE) DISABLE_IF_ENUM(TYPE, Bool) InRange(UInt i, C TYPE &container) {return UInt (i)<UInt (Elms(container));} // template specialization for not enum's
  81. T1(TYPE) DISABLE_IF_ENUM(TYPE, Bool) InRange(Long i, C TYPE &container) {return ULong(i)<ULong(Elms(container));} // template specialization for not enum's
  82. T1(TYPE) DISABLE_IF_ENUM(TYPE, Bool) InRange(ULong i, C TYPE &container) {return ULong(i)<ULong(Elms(container));} // template specialization for not enum's
  83. /******************************************************************************/
  84. T1(TYPE) struct ClassFunc // various basic functions used by many classes
  85. {
  86. static void New (Ptr elm ) { new( elm ) TYPE ;}
  87. static void Del (Ptr elm ) { ( (TYPE*)elm )-> ~TYPE( );}
  88. static void Copy (Ptr dest, CPtr src ) { (*(TYPE*)dest)=*(C TYPE*)src ;}
  89. static Bool Load (Ptr elm , C Str &file ) {return ( (TYPE*)elm )-> load(file );}
  90. static Bool LoadUser (Ptr elm , C Str &file, Ptr user) {return ( (TYPE*)elm )-> load(file, user);}
  91. static Bool LoadEmpty(Ptr elm ) {return ( (TYPE*)elm )-> load( );}
  92. static void Unload (Ptr elm ) {return ( (TYPE*)elm )-> unload( );}
  93. static inline Bool HasNew() {return New!=ClassFunc<Int>::New;} static inline void (*GetNew())(Ptr elm) {return HasNew() ? New : null;}
  94. static inline Bool HasDel() {return Del!=ClassFunc<Int>::Del;} static inline void (*GetDel())(Ptr elm) {return HasDel() ? Del : null;}
  95. };
  96. // force empty new delete in case some compilers don't merge similar functions, this also helps in DEBUG mode which doesn't do merging
  97. #define EMPTY_NEW_DEL(TYPE) \
  98. template<> inline Bool ClassFunc<TYPE>::HasNew() {return false;} \
  99. template<> inline Bool ClassFunc<TYPE>::HasDel() {return false;}
  100. EMPTY_NEW_DEL(Bool )
  101. EMPTY_NEW_DEL(Char ) EMPTY_NEW_DEL(Char8 )
  102. EMPTY_NEW_DEL(SByte) EMPTY_NEW_DEL(Byte )
  103. EMPTY_NEW_DEL(Short) EMPTY_NEW_DEL(UShort)
  104. EMPTY_NEW_DEL(Int ) EMPTY_NEW_DEL(UInt )
  105. EMPTY_NEW_DEL(Long ) EMPTY_NEW_DEL(ULong )
  106. EMPTY_NEW_DEL(Flt ) EMPTY_NEW_DEL(Dbl )
  107. EMPTY_NEW_DEL(Ptr )
  108. #undef EMPTY_NEW_DEL
  109. /******************************************************************************/
  110. // SORT
  111. /******************************************************************************/
  112. void _Sort( Ptr data, Int elms, Int elm_size, Int compare(CPtr a, CPtr b));
  113. void _Sort(_Memb &memb, Int compare(CPtr a, CPtr b));
  114. void _Sort(_Memx &memx, Int compare(CPtr a, CPtr b));
  115. void _Sort(_Meml &meml, Int compare(CPtr a, CPtr b));
  116. Bool _BinarySearch( CPtr data, Int elms, Int elm_size, CPtr value, Int &index, Int compare(CPtr a, CPtr b));
  117. Bool _BinarySearch(C _Memb &data, CPtr value, Int &index, Int compare(CPtr a, CPtr b));
  118. Bool _BinarySearch(C _Memx &data, CPtr value, Int &index, Int compare(CPtr a, CPtr b));
  119. Bool _BinarySearch(C _Meml &data, CPtr value, Int &index, Int compare(CPtr a, CPtr b));
  120. T1(TYPE) void Sort(TYPE *data, Int elms, Int compare(C TYPE &a, C TYPE &b)) {_Sort(Ptr(data), elms, SIZE(TYPE), (Int(*)(CPtr, CPtr))compare);}
  121. T2(DATA, VALUE) Bool BinarySearch(C DATA *data, Int elms, C VALUE &value, Int &index, Int compare(C DATA &a, C VALUE &b)) {return _BinarySearch(data, elms, SIZE(DATA), &value, index, (Int(*)(CPtr, CPtr))compare);}
  122. #if EE_PRIVATE
  123. struct FloatIndex // Float + Index
  124. {
  125. Flt f; // float
  126. Int i; // index
  127. static Int Compare(C FloatIndex &a, C FloatIndex &b) {return EE::Compare(a.f, b.f);}
  128. };
  129. inline void Sort(FloatIndex *data, Int elms) {Sort(data, elms, FloatIndex::Compare);}
  130. #endif
  131. /******************************************************************************/
  132. // MEMORY
  133. /******************************************************************************/
  134. void _Realloc (Ptr &data, IntPtr size_new, IntPtr size_old); // reallocate memory without losing data , Exit on fail !! this function can be used only for memory allocated using 'Alloc', but not 'New' !!
  135. void _ReallocZero(Ptr &data, IntPtr size_new, IntPtr size_old); // reallocate memory without losing data and zero new elements, Exit on fail !! this function can be used only for memory allocated using 'Alloc', but not 'New' !!
  136. T1(TYPE) void Realloc (TYPE* &data, Int elms_new, Int elms_old) {_Realloc (*(Ptr*)&data, elms_new*SIZE(TYPE), elms_old*SIZE(TYPE));}
  137. T1(TYPE) void ReallocZero(TYPE* &data, Int elms_new, Int elms_old) {_ReallocZero(*(Ptr*)&data, elms_new*SIZE(TYPE), elms_old*SIZE(TYPE));}
  138. #if EE_PRIVATE
  139. T1(TYPE) void Realloc1 (TYPE* &data, Int elms_old) {Realloc (data, elms_old+1, elms_old);}
  140. T1(TYPE) void ReallocZero1(TYPE* &data, Int elms_old) {ReallocZero(data, elms_old+1, elms_old);}
  141. void _MoveElmLeftUnsafe(Ptr data, UInt elm_size, Int elm, Int new_index, Ptr temp);
  142. #endif
  143. void _ReverseOrder(Ptr data, Int elms, UInt elm_size ); // reverse order of elements (first<->last)
  144. void _RotateOrder(Ptr data, Int elms, UInt elm_size, Int offset ); // rotate order of elements, changes the order of elements so "new_index=old_index+offset", 'offset'=offset of moving the original indexes into target indexes (-Inf..Inf)
  145. void _RandomizeOrder(Ptr data, Int elms, UInt elm_size, Randomizer &random=Random); // randomize order of elements
  146. void _MoveElm (Ptr data, Int elms, UInt elm_size, Int elm, Int new_index ); // move 'elm' element to new position located at 'new_index'
  147. T1(TYPE) void ReverseOrder(TYPE *data, Int elms ) { _ReverseOrder(data, elms, SIZE(TYPE) );}
  148. T1(TYPE) void RotateOrder(TYPE *data, Int elms, Int offset ) { _RotateOrder(data, elms, SIZE(TYPE), offset );}
  149. T1(TYPE) void RandomizeOrder(TYPE *data, Int elms, Randomizer &random ) {_RandomizeOrder(data, elms, SIZE(TYPE), random );}
  150. T1(TYPE) void MoveElm (TYPE *data, Int elms, Int elm, Int new_index) { _MoveElm (data, elms, SIZE(TYPE), elm, new_index);}
  151. /******************************************************************************/
  152. // REFERENCE
  153. /******************************************************************************/
  154. T1(TYPE) Bool Reference<TYPE>::save(File &f )C { return f.put(_object_id);}
  155. T1(TYPE) Bool Reference<TYPE>::load(File &f ) {_object=null; if(f.get(_object_id))return true; _object_id.zero(); return false;}
  156. T1(TYPE) T1(WORLD) void Reference<TYPE>::link(WORLD &world) {if(!valid() && _object_id.valid())_object=CAST(TYPE, world.findObjById(_object_id));}
  157. /******************************************************************************/
  158. // FIXED ARRAY
  159. /******************************************************************************/
  160. template<typename TYPE, Int NUM> FixedArray<TYPE, NUM>::FixedArray( ) {_elm_size=SIZE(TYPE); _data=null;}
  161. template<typename TYPE, Int NUM> FixedArray<TYPE, NUM>::FixedArray(C FixedArray &src) : FixedArray() {T=src;}
  162. template<typename TYPE, Int NUM> FixedArray<TYPE, NUM>& FixedArray<TYPE, NUM>::operator= (C FixedArray &src) {FREPAO(T)=src[i]; return T;}
  163. template<typename TYPE, Int NUM> FixedArray<TYPE, NUM>& FixedArray<TYPE, NUM>::del () {DeleteN(_data); _elm_size=SIZE(TYPE); return T;}
  164. template<typename TYPE, Int NUM> T1(EXTENDED) FixedArray<TYPE, NUM>& FixedArray<TYPE, NUM>::replaceClass() {ASSERT_BASE_EXTENDED<TYPE, EXTENDED>(); del(); _elm_size=SIZE(EXTENDED); _data=new EXTENDED[NUM]; return T;}
  165. template<typename TYPE> FixedElm<TYPE>::FixedElm ( ) {_data=null;}
  166. template<typename TYPE> FixedElm<TYPE>::FixedElm (C FixedElm &src) : FixedElm() {T=src;}
  167. template<typename TYPE> FixedElm<TYPE>& FixedElm<TYPE>::operator=(C FixedElm &src) {T()=src(); return T;}
  168. template<typename TYPE> FixedElm<TYPE>& FixedElm<TYPE>::del () {Delete(_data); return T;}
  169. template<typename TYPE> T1(EXTENDED) FixedElm<TYPE>& FixedElm<TYPE>::replaceClass() {ASSERT_BASE_EXTENDED<TYPE, EXTENDED>(); del(); _data=new EXTENDED; return T;}
  170. /******************************************************************************/
  171. // MEMS
  172. /******************************************************************************/
  173. T1(TYPE) Mems<TYPE>& Mems<TYPE>::clear()
  174. {
  175. if(ClassFunc<TYPE>::HasDel())REPA(T)T[i].~TYPE();
  176. Free(_data); _elms=0;
  177. return T;
  178. }
  179. T1(TYPE) Mems<TYPE>& Mems<TYPE>::del() {return clear();}
  180. T1(TYPE) Int Mems<TYPE>::elms ()C {return _elms;}
  181. T1(TYPE) UInt Mems<TYPE>::elmSize ()C {return SIZE(TYPE);}
  182. T1(TYPE) UInt Mems<TYPE>::memUsage()C {return elms()*elmSize();}
  183. T1(TYPE) TYPE* Mems<TYPE>::data ( ) { return _data ;}
  184. T1(TYPE) TYPE* Mems<TYPE>::addr (Int i) {return InRange(i, _elms) ? &_data[i] : null;}
  185. T1(TYPE) TYPE& Mems<TYPE>::operator[](Int i) { RANGE_ASSERT(i, _elms); return _data[i];}
  186. T1(TYPE) TYPE& Mems<TYPE>::first ( ) {return T[ 0];}
  187. T1(TYPE) TYPE& Mems<TYPE>::last ( ) {return T[elms()-1];}
  188. T1(TYPE) TYPE Mems<TYPE>::popFirst( Bool keep_order) {TYPE temp=first(); remove (0, keep_order); return temp;}
  189. T1(TYPE) TYPE Mems<TYPE>::pop (Int i, Bool keep_order) {TYPE temp= T[i]; remove (i, keep_order); return temp;}
  190. T1(TYPE) TYPE Mems<TYPE>::pop ( ) {TYPE temp= last(); removeLast( ); return temp;}
  191. T1(TYPE) C TYPE* Mems<TYPE>::data ( )C {return ConstCast(T).data ( );}
  192. T1(TYPE) C TYPE* Mems<TYPE>::addr (Int i)C {return ConstCast(T).addr (i);}
  193. T1(TYPE) C TYPE& Mems<TYPE>::operator[](Int i)C {return ConstCast(T) [i];}
  194. T1(TYPE) C TYPE& Mems<TYPE>::first ( )C {return ConstCast(T).first( );}
  195. T1(TYPE) C TYPE& Mems<TYPE>::last ( )C {return ConstCast(T).last ( );}
  196. T1(TYPE) TYPE& Mems<TYPE>::operator()(Int i)
  197. {
  198. if(i< 0 )Exit("i<0 inside 'Mems.operator()(Int i)'");
  199. if(i>=elms())setNumZero(i+1);
  200. return T[i];
  201. }
  202. T1(TYPE) TYPE& Mems<TYPE>::New ( ) {return T[addNum(1)];}
  203. T1(TYPE) TYPE& Mems<TYPE>::NewAt(Int i)
  204. {
  205. Clamp(i, 0, elms());
  206. TYPE *temp=Alloc<TYPE>(elms()+1);
  207. CopyN(temp , data() , i);
  208. CopyN(temp+i+1, data()+i, elms()-i);
  209. Free(_data); _data=temp; _elms++;
  210. TYPE &elm=T[i]; new(&elm)TYPE; return elm;
  211. }
  212. T1(TYPE) Int Mems<TYPE>::index(C TYPE *elm)C
  213. {
  214. UIntPtr i=UIntPtr(elm)-UIntPtr(data());
  215. if(i<UIntPtr(elms()*elmSize()))return i/elmSize(); // unsigned compare will already guarantee "i>=0 && "
  216. return -1;
  217. }
  218. T1(TYPE) Bool Mems<TYPE>::contains(C TYPE *elm)C {return index(elm)>=0;}
  219. T1(TYPE) Mems<TYPE>& Mems<TYPE>::remove(Int i, Bool /*keep_order*/)
  220. {
  221. if(InRange(i, T))
  222. {
  223. T[i].~TYPE();
  224. TYPE *temp=Alloc<TYPE>(elms()-1);
  225. CopyN(temp , data() , i );
  226. CopyN(temp+i, data()+i+1, elms()-i-1);
  227. Free(_data); _data=temp; _elms--;
  228. }
  229. return T;
  230. }
  231. T1(TYPE) Mems<TYPE>& Mems<TYPE>::removeLast( ) {return remove(elms()-1 );}
  232. T1(TYPE) Mems<TYPE>& Mems<TYPE>::removeData(C TYPE *elm, Bool keep_order) {return remove(index(elm), keep_order);}
  233. T1(TYPE) Mems<TYPE>& Mems<TYPE>::setNum(Int num)
  234. {
  235. MAX(num, 0);
  236. if (num>elms()) // add new elements
  237. {
  238. Int old_elms=elms();
  239. TYPE *temp=Alloc<TYPE>(num);
  240. CopyN(temp, data(), elms());
  241. Free (_data); _data=temp; _elms=num;
  242. if(ClassFunc<TYPE>::HasNew())for(Int i=old_elms; i<elms(); i++)new(&T[i])TYPE;
  243. }else
  244. if(num<elms()) // remove elements
  245. {
  246. if(ClassFunc<TYPE>::HasDel())for(Int i=num; i<elms(); i++)T[i].~TYPE();
  247. TYPE *temp=Alloc<TYPE>(num);
  248. CopyN(temp, data(), num);
  249. Free (_data); _data=temp; _elms=num;
  250. }
  251. return T;
  252. }
  253. T1(TYPE) Mems<TYPE>& Mems<TYPE>::setNumZero(Int num)
  254. {
  255. MAX(num, 0);
  256. if (num>elms()) // add new elements
  257. {
  258. Int old_elms=elms();
  259. TYPE *temp=Alloc<TYPE>(num);
  260. CopyN(temp , data(), elms());
  261. ZeroN(temp+elms(), num-elms());
  262. Free (_data); _data=temp; _elms=num;
  263. if(ClassFunc<TYPE>::HasNew())for(Int i=old_elms; i<elms(); i++)new(&T[i])TYPE;
  264. }else
  265. if(num<elms()) // remove elements
  266. {
  267. if(ClassFunc<TYPE>::HasDel())for(Int i=num; i<elms(); i++)T[i].~TYPE();
  268. TYPE *temp=Alloc<TYPE>(num);
  269. CopyN(temp, data(), num);
  270. Free (_data); _data=temp; _elms=num;
  271. }
  272. return T;
  273. }
  274. T1(TYPE) Int Mems<TYPE>::addNum(Int num) {Int index=elms(); setNum(elms()+num); return index;}
  275. T1(TYPE) T1(VALUE) Bool Mems<TYPE>::binarySearch(C VALUE &value, Int &index, Int compare(C TYPE &a, C VALUE &b))C {return _BinarySearch(data(), elms(), elmSize(), &value, index, (Int(*)(CPtr, CPtr))compare);}
  276. T1(TYPE) Mems<TYPE>& Mems<TYPE>::sort(Int compare(C TYPE &a, C TYPE &b)) {_Sort(data(), elms(), elmSize(), (Int(*)(CPtr, CPtr))compare); return T;}
  277. T1(TYPE) Mems<TYPE>& Mems<TYPE>:: reverseOrder( ) { _ReverseOrder(data(), elms(), elmSize() ); return T;}
  278. T1(TYPE) Mems<TYPE>& Mems<TYPE>::randomizeOrder( ) {_RandomizeOrder(data(), elms(), elmSize() ); return T;}
  279. T1(TYPE) Mems<TYPE>& Mems<TYPE>:: rotateOrder(Int offset ) { _RotateOrder(data(), elms(), elmSize(), offset ); return T;}
  280. T1(TYPE) Mems<TYPE>& Mems<TYPE>:: moveElm (Int elm, Int new_index) { _MoveElm (data(), elms(), elmSize(), elm, new_index); return T;}
  281. T1(TYPE) Mems<TYPE>& Mems<TYPE>:: swapOrder(Int i , Int j ) {if(InRange(i, T) && InRange(j, T))Swap(_data[i], _data[j]); return T;}
  282. T1(TYPE) Mems<TYPE>& Mems<TYPE>::operator=(C Mems <TYPE > &src) {if(this!=&src ){setNum(src.elms()); FREPAO(T)=src[i];} return T;}
  283. T1(TYPE) Mems<TYPE>& Mems<TYPE>::operator=(C Memc <TYPE > &src) { setNum(src.elms()); FREPAO(T)=src[i]; return T;}
  284. T1(TYPE) template<Int size> Mems<TYPE>& Mems<TYPE>::operator=(C Memt <TYPE, size> &src) { setNum(src.elms()); FREPAO(T)=src[i]; return T;}
  285. T1(TYPE) Mems<TYPE>& Mems<TYPE>::operator=(C Memb <TYPE > &src) { setNum(src.elms()); FREPAO(T)=src[i]; return T;}
  286. T1(TYPE) Mems<TYPE>& Mems<TYPE>::operator=(C Memx <TYPE > &src) { setNum(src.elms()); FREPAO(T)=src[i]; return T;}
  287. T1(TYPE) Mems<TYPE>& Mems<TYPE>::operator=(C Meml <TYPE > &src) { setNum(src.elms()); FREPAO(T)=src[i]; return T;}
  288. T1(TYPE) template<Int size> Mems<TYPE>& Mems<TYPE>::operator=(C MemPtr<TYPE, size> &src) {if(this!=src._mems){setNum(src.elms()); FREPAO(T)=src[i];} return T;}
  289. T1(TYPE) Mems<TYPE>& Mems<TYPE>::operator=( Mems <TYPE > &&src) {Swap(T, src); return T;}
  290. #if EE_PRIVATE
  291. T1(TYPE) void Mems<TYPE>::copyTo ( TYPE *dest)C {Copy(dest , data(), elms()*elmSize()); }
  292. T1(TYPE) Mems<TYPE>& Mems<TYPE>::copyFrom(C TYPE *src ) {Copy(data(), src , elms()*elmSize()); return T;}
  293. T1(TYPE) void Mems<TYPE>:: setFrom( TYPE* &data, Int elms) {if(data!=T._data){del(); T._data=data; T._elms=elms; data=null;}}
  294. T1(TYPE) void Mems<TYPE>:: setTemp( TYPE* data, Int elms) { T._data=data; T._elms=elms; }
  295. #endif
  296. T1(TYPE) Bool Mems<TYPE>::save(File &f)C { f.cmpUIntV(elms()) ; FREPA(T)if(!T[i].save(f))return false; return f.ok();}
  297. T1(TYPE) Bool Mems<TYPE>::save(File &f) { f.cmpUIntV(elms()) ; FREPA(T)if(!T[i].save(f))return false; return f.ok();}
  298. T1(TYPE) Bool Mems<TYPE>::load(File &f) {setNum(f.decUIntV( )); FREPA(T)if(!T[i].load(f))goto error; if(f.ok())return true; error: clear(); return false;}
  299. T1(TYPE) T1(USER) Bool Mems<TYPE>::save(File &f, C USER &user)C { f.cmpUIntV(elms()) ; FREPA(T)if(!T[i].save(f, user))return false; return f.ok();}
  300. T1(TYPE) T1(USER) Bool Mems<TYPE>::load(File &f, C USER &user) {setNum(f.decUIntV( )); FREPA(T)if(!T[i].load(f, user))goto error; if(f.ok())return true; error: clear(); return false;}
  301. T1(TYPE) T2(USER, USER1) Bool Mems<TYPE>::save(File &f, C USER &user, C USER1 &user1)C { f.cmpUIntV(elms()) ; FREPA(T)if(!T[i].save(f, user, user1))return false; return f.ok();}
  302. T1(TYPE) T2(USER, USER1) Bool Mems<TYPE>::load(File &f, C USER &user, C USER1 &user1) {setNum(f.decUIntV( )); FREPA(T)if(!T[i].load(f, user, user1))goto error; if(f.ok())return true; error: clear(); return false;}
  303. T1(TYPE) Bool Mems<TYPE>::saveRawData(File &f)C {return f.putN(data(), elms());}
  304. T1(TYPE) Bool Mems<TYPE>::loadRawData(File &f) {return f.getN(data(), elms());}
  305. T1(TYPE) Bool Mems<TYPE>::saveRaw(File &f)C { f.cmpUIntV(elms()) ; saveRawData(f); return f.ok();}
  306. T1(TYPE) Bool Mems<TYPE>::loadRaw(File &f) {setNum(f.decUIntV( )); loadRawData(f); if(f.ok())return true; clear(); return false;}
  307. #if EE_PRIVATE
  308. T1(TYPE) Bool Mems<TYPE>::_saveRaw(File &f)C { f.putInt(elms()) ; saveRawData(f); return f.ok();}
  309. T1(TYPE) Bool Mems<TYPE>::_loadRaw(File &f) {setNum(f.getInt( )); loadRawData(f); if(f.ok())return true; clear(); return false;}
  310. T1(TYPE) Bool Mems<TYPE>::_save (File &f)C { f.putInt(elms()) ; FREPA(T)if(!T[i].save(f))return false; return f.ok();}
  311. T1(TYPE) Bool Mems<TYPE>::_load (File &f) {setNum(f.getInt( )); FREPA(T)if(!T[i].load(f))goto error; if(f.ok())return true; error: clear(); return false;}
  312. #endif
  313. T1(TYPE) Mems<TYPE>::~Mems( ) {del();}
  314. T1(TYPE) Mems<TYPE>:: Mems( ) {_data=null; _elms=0;}
  315. T1(TYPE) Mems<TYPE>:: Mems(C Mems &src) : Mems() {T=src;}
  316. T1(TYPE) Mems<TYPE>:: Mems( Mems &&src) : Mems() {Swap(T, src);}
  317. /******************************************************************************/
  318. // MEMC
  319. /******************************************************************************/
  320. T1(TYPE) Memc<TYPE>& Memc<TYPE>::clear() {_Memc::clear(); return T;}
  321. T1(TYPE) Memc<TYPE>& Memc<TYPE>::del () {_Memc::del (); return T;}
  322. T1(TYPE) Int Memc<TYPE>::elms ()C {return _Memc::elms ();}
  323. T1(TYPE) UInt Memc<TYPE>::elmSize ()C {return _Memc::elmSize ();}
  324. T1(TYPE) UInt Memc<TYPE>::memUsage()C {return _Memc::memUsage();}
  325. T1(TYPE) TYPE* Memc<TYPE>::data ( ) {DEBUG_ASSERT(elmSize()==SIZE(TYPE) || elms()<=1, "'Memc.data' Can't cast to C++ pointer after using 'replaceClass'."); return (TYPE*)_Memc::data();}
  326. T1(TYPE) TYPE* Memc<TYPE>::addr (Int i) {return (TYPE*)_Memc::addr (i);}
  327. T1(TYPE) TYPE* Memc<TYPE>::addrFirst ( ) {return (TYPE*)_Memc::addrFirst ( );}
  328. T1(TYPE) TYPE* Memc<TYPE>::addrLast ( ) {return (TYPE*)_Memc::addrLast ( );}
  329. T1(TYPE) TYPE& Memc<TYPE>::operator[](Int i) {return *(TYPE*)_Memc::operator[](i);}
  330. T1(TYPE) TYPE& Memc<TYPE>::operator()(Int i) {return *(TYPE*)_Memc::operator()(i);}
  331. T1(TYPE) TYPE& Memc<TYPE>::first ( ) {return *(TYPE*)_Memc::first ( );}
  332. T1(TYPE) TYPE& Memc<TYPE>::last ( ) {return *(TYPE*)_Memc::last ( );}
  333. T1(TYPE) TYPE& Memc<TYPE>::New ( ) {return *(TYPE*)_Memc::New ( );}
  334. T1(TYPE) TYPE& Memc<TYPE>::NewAt (Int i) {return *(TYPE*)_Memc::NewAt (i);}
  335. T1(TYPE) TYPE Memc<TYPE>::popFirst( Bool keep_order) {TYPE temp=first(); remove (0, keep_order); return temp;}
  336. T1(TYPE) TYPE Memc<TYPE>::pop (Int i, Bool keep_order) {TYPE temp= T[i]; remove (i, keep_order); return temp;}
  337. T1(TYPE) TYPE Memc<TYPE>::pop ( ) {TYPE temp= last(); removeLast( ); return temp;}
  338. T1(TYPE) C TYPE* Memc<TYPE>::data ( )C {return ConstCast(T).data ( );}
  339. T1(TYPE) C TYPE* Memc<TYPE>::addr (Int i)C {return ConstCast(T).addr (i);}
  340. T1(TYPE) C TYPE* Memc<TYPE>::addrFirst ( )C {return ConstCast(T).addrFirst( );}
  341. T1(TYPE) C TYPE* Memc<TYPE>::addrLast ( )C {return ConstCast(T).addrLast ( );}
  342. T1(TYPE) C TYPE& Memc<TYPE>::operator[](Int i)C {return ConstCast(T) [i];}
  343. T1(TYPE) C TYPE& Memc<TYPE>::first ( )C {return ConstCast(T).first ( );}
  344. T1(TYPE) C TYPE& Memc<TYPE>::last ( )C {return ConstCast(T).last ( );}
  345. T1(TYPE) Int Memc<TYPE>::index (C TYPE *elm)C {return _Memc::index (elm);}
  346. T1(TYPE) Bool Memc<TYPE>::contains(C TYPE *elm)C {return _Memc::contains(elm);}
  347. T1(TYPE) Memc<TYPE>& Memc<TYPE>::removeLast( ) {_Memc::removeLast( ); return T;}
  348. T1(TYPE) Memc<TYPE>& Memc<TYPE>::remove ( Int i , Bool keep_order) {_Memc::remove (i, keep_order); return T;}
  349. T1(TYPE) Memc<TYPE>& Memc<TYPE>::removeNum ( Int i , Int n, Bool keep_order) {_Memc::removeNum (i, n, keep_order); return T;}
  350. T1(TYPE) Memc<TYPE>& Memc<TYPE>::removeData(C TYPE *elm, Bool keep_order) {_Memc::removeData(elm, keep_order); return T;}
  351. T1(TYPE) Memc<TYPE>& Memc<TYPE>::setNum (Int num) { _Memc::setNum (num); return T;}
  352. T1(TYPE) Memc<TYPE>& Memc<TYPE>::setNumZero(Int num) { _Memc::setNumZero(num); return T;}
  353. T1(TYPE) Int Memc<TYPE>::addNum (Int num) {return _Memc::addNum (num); }
  354. T1(TYPE) T1(VALUE) Bool Memc<TYPE>::binarySearch(C VALUE &value, Int &index, Int compare(C TYPE &a, C VALUE &b))C {return _Memc::binarySearch(&value, index, (Int(*)(CPtr, CPtr))compare);}
  355. T1(TYPE) Memc<TYPE>& Memc<TYPE>:: sort(Int compare(C TYPE &a, C TYPE &b)) {_Memc:: sort((Int(*)(CPtr, CPtr))compare); return T;}
  356. T1(TYPE) Memc<TYPE>& Memc<TYPE>:: reverseOrder( ) {_Memc:: reverseOrder( ); return T;}
  357. T1(TYPE) Memc<TYPE>& Memc<TYPE>::randomizeOrder( ) {_Memc::randomizeOrder( ); return T;}
  358. T1(TYPE) Memc<TYPE>& Memc<TYPE>:: rotateOrder(Int offset ) {_Memc:: rotateOrder(offset ); return T;}
  359. T1(TYPE) Memc<TYPE>& Memc<TYPE>:: swapOrder(Int i , Int j ) {_Memc:: swapOrder(i, j ); return T;}
  360. T1(TYPE) Memc<TYPE>& Memc<TYPE>:: moveElm (Int elm, Int new_index ) {_Memc:: moveElm (elm, new_index ); return T;}
  361. T1(TYPE) Memc<TYPE>& Memc<TYPE>::operator=(C Mems <TYPE > &src) { setNum(src.elms()); FREPAO(T)=src[i]; return T;}
  362. T1(TYPE) Memc<TYPE>& Memc<TYPE>::operator=(C Memc <TYPE > &src) {if(this!=&src ){setNum(src.elms()); FREPAO(T)=src[i];} return T;}
  363. T1(TYPE) template<Int size> Memc<TYPE>& Memc<TYPE>::operator=(C Memt <TYPE, size> &src) { setNum(src.elms()); FREPAO(T)=src[i]; return T;}
  364. T1(TYPE) Memc<TYPE>& Memc<TYPE>::operator=(C Memb <TYPE > &src) { setNum(src.elms()); FREPAO(T)=src[i]; return T;}
  365. T1(TYPE) Memc<TYPE>& Memc<TYPE>::operator=(C Memx <TYPE > &src) { setNum(src.elms()); FREPAO(T)=src[i]; return T;}
  366. T1(TYPE) Memc<TYPE>& Memc<TYPE>::operator=(C Meml <TYPE > &src) { setNum(src.elms()); FREPAO(T)=src[i]; return T;}
  367. T1(TYPE) template<Int size> Memc<TYPE>& Memc<TYPE>::operator=(C MemPtr<TYPE, size> &src) {if(this!=src._memc){setNum(src.elms()); FREPAO(T)=src[i];} return T;}
  368. T1(TYPE) Memc<TYPE>& Memc<TYPE>::operator=( Memc <TYPE > &&src) {Swap(T, src); return T;}
  369. T1(TYPE) T1(EXTENDED) Memc<TYPE>& Memc<TYPE>::replaceClass () {ASSERT_BASE_EXTENDED<TYPE, EXTENDED>(); _Memc::_reset(SIZE(EXTENDED), ClassFunc<EXTENDED>::GetNew(), ClassFunc<EXTENDED>::GetDel()); return T;}
  370. T1(TYPE) T1(BASE ) Memc<TYPE>::operator Memc<BASE>&() {ASSERT_BASE_EXTENDED<BASE, TYPE >(); return *( Memc<BASE>*)this;}
  371. T1(TYPE) T1(BASE ) Memc<TYPE>::operator C Memc<BASE>&()C {ASSERT_BASE_EXTENDED<BASE, TYPE >(); return *(C Memc<BASE>*)this;}
  372. T1(TYPE) Bool Memc<TYPE>::save(File &f)C { f.cmpUIntV(elms()) ; FREPA(T)if(!T[i].save(f))return false; return f.ok();}
  373. T1(TYPE) Bool Memc<TYPE>::save(File &f) { f.cmpUIntV(elms()) ; FREPA(T)if(!T[i].save(f))return false; return f.ok();}
  374. T1(TYPE) Bool Memc<TYPE>::load(File &f) {setNum(f.decUIntV( )); FREPA(T)if(!T[i].load(f))goto error; if(f.ok())return true; error: clear(); return false;}
  375. T1(TYPE) T1(USER) Bool Memc<TYPE>::save(File &f, C USER &user)C { f.cmpUIntV(elms()) ; FREPA(T)if(!T[i].save(f, user))return false; return f.ok();}
  376. T1(TYPE) T1(USER) Bool Memc<TYPE>::load(File &f, C USER &user) {setNum(f.decUIntV( )); FREPA(T)if(!T[i].load(f, user))goto error; if(f.ok())return true; error: clear(); return false;}
  377. T1(TYPE) T2(USER, USER1) Bool Memc<TYPE>::save(File &f, C USER &user, C USER1 &user1)C { f.cmpUIntV(elms()) ; FREPA(T)if(!T[i].save(f, user, user1))return false; return f.ok();}
  378. T1(TYPE) T2(USER, USER1) Bool Memc<TYPE>::load(File &f, C USER &user, C USER1 &user1) {setNum(f.decUIntV( )); FREPA(T)if(!T[i].load(f, user, user1))goto error; if(f.ok())return true; error: clear(); return false;}
  379. T1(TYPE) Bool Memc<TYPE>::saveRaw(File &f)C {return _Memc::saveRaw(f);}
  380. T1(TYPE) Bool Memc<TYPE>::loadRaw(File &f) {return _Memc::loadRaw(f);}
  381. #if EE_PRIVATE
  382. T1(TYPE) Bool Memc<TYPE>::_saveRaw(File &f)C {return _Memc::_saveRaw(f);}
  383. T1(TYPE) Bool Memc<TYPE>::_loadRaw(File &f) {return _Memc::_loadRaw(f);}
  384. T1(TYPE) Bool Memc<TYPE>::_save (File &f)C { f.putInt(elms()) ; FREPA(T)if(!T[i].save(f))return false; return f.ok();}
  385. T1(TYPE) Bool Memc<TYPE>::_load (File &f) {setNum(f.getInt( )); FREPA(T)if(!T[i].load(f))goto error; if(f.ok())return true; error: clear(); return false;}
  386. #endif
  387. T1(TYPE) Memc<TYPE>::Memc( ) : _Memc(SIZE(TYPE) , ClassFunc<TYPE>::GetNew(), ClassFunc<TYPE>::GetDel()) {}
  388. T1(TYPE) Memc<TYPE>::Memc(C Memc &src) : _Memc(src.elmSize(), src._new , src._del ) {T=src;}
  389. T1(TYPE) Memc<TYPE>::Memc( Memc &&src) : _Memc( 0, null , null ) {Swap(T, src);}
  390. /******************************************************************************/
  391. // MEMC ABSTRACT
  392. /******************************************************************************/
  393. T1(TYPE) MemcAbstract<TYPE>& MemcAbstract<TYPE>::clear() {_Memc::clear(); return T;}
  394. T1(TYPE) MemcAbstract<TYPE>& MemcAbstract<TYPE>::del () {_Memc::del (); return T;}
  395. T1(TYPE) Int MemcAbstract<TYPE>::elms ()C {return _Memc::elms ();}
  396. T1(TYPE) UInt MemcAbstract<TYPE>::elmSize ()C {return _Memc::elmSize ();}
  397. T1(TYPE) UInt MemcAbstract<TYPE>::memUsage()C {return _Memc::memUsage();}
  398. T1(TYPE) TYPE* MemcAbstract<TYPE>::data ( ) {DEBUG_ASSERT(elmSize()==SIZE(TYPE) || elms()<=1, "'MemcAbstract.data' Can't cast to C++ pointer after using 'replaceClass'."); return (TYPE*)_Memc::data();}
  399. T1(TYPE) TYPE* MemcAbstract<TYPE>::addr (Int i) {return (TYPE*)_Memc::addr (i);}
  400. T1(TYPE) TYPE& MemcAbstract<TYPE>::operator[](Int i) {return *(TYPE*)_Memc::operator[](i);}
  401. T1(TYPE) TYPE& MemcAbstract<TYPE>::operator()(Int i) {return *(TYPE*)_Memc::operator()(i);}
  402. T1(TYPE) TYPE& MemcAbstract<TYPE>::first ( ) {return *(TYPE*)_Memc::first ( );}
  403. T1(TYPE) TYPE& MemcAbstract<TYPE>::last ( ) {return *(TYPE*)_Memc::last ( );}
  404. T1(TYPE) TYPE& MemcAbstract<TYPE>::New ( ) {return *(TYPE*)_Memc::New ( );}
  405. T1(TYPE) TYPE& MemcAbstract<TYPE>::NewAt (Int i) {return *(TYPE*)_Memc::NewAt (i);}
  406. T1(TYPE) C TYPE* MemcAbstract<TYPE>::data ( )C {return ConstCast(T).data ( );}
  407. T1(TYPE) C TYPE* MemcAbstract<TYPE>::addr (Int i)C {return ConstCast(T).addr (i);}
  408. T1(TYPE) C TYPE& MemcAbstract<TYPE>::operator[](Int i)C {return ConstCast(T) [i];}
  409. T1(TYPE) C TYPE& MemcAbstract<TYPE>::first ( )C {return ConstCast(T).first( );}
  410. T1(TYPE) C TYPE& MemcAbstract<TYPE>::last ( )C {return ConstCast(T).last ( );}
  411. T1(TYPE) Int MemcAbstract<TYPE>::index (C TYPE *elm)C {return _Memc::index (elm);}
  412. T1(TYPE) Bool MemcAbstract<TYPE>::contains(C TYPE *elm)C {return _Memc::contains(elm);}
  413. T1(TYPE) MemcAbstract<TYPE>& MemcAbstract<TYPE>::removeLast( ) {_Memc::removeLast( ); return T;}
  414. T1(TYPE) MemcAbstract<TYPE>& MemcAbstract<TYPE>::remove ( Int i , Bool keep_order) {_Memc::remove (i , keep_order); return T;}
  415. T1(TYPE) MemcAbstract<TYPE>& MemcAbstract<TYPE>::removeData(C TYPE *elm, Bool keep_order) {_Memc::removeData(elm, keep_order); return T;}
  416. T1(TYPE) MemcAbstract<TYPE>& MemcAbstract<TYPE>::setNum (Int num) { _Memc::setNum (num); return T;}
  417. T1(TYPE) MemcAbstract<TYPE>& MemcAbstract<TYPE>::setNumZero(Int num) { _Memc::setNumZero(num); return T;}
  418. T1(TYPE) Int MemcAbstract<TYPE>::addNum (Int num) {return _Memc::addNum (num); }
  419. T1(TYPE) T1(EXTENDED) MemcAbstract<TYPE>& MemcAbstract<TYPE>::replaceClass () {ASSERT_BASE_EXTENDED<TYPE, EXTENDED>(); _Memc::_reset(SIZE(EXTENDED), ClassFunc<EXTENDED>::GetNew(), ClassFunc<EXTENDED>::GetDel()); return T;}
  420. T1(TYPE) T1(BASE ) MemcAbstract<TYPE>::operator Memc<BASE>&() {ASSERT_BASE_EXTENDED<BASE, TYPE >(); return *( Memc<BASE>*)this;}
  421. T1(TYPE) T1(BASE ) MemcAbstract<TYPE>::operator C Memc<BASE>&()C {ASSERT_BASE_EXTENDED<BASE, TYPE >(); return *(C Memc<BASE>*)this;}
  422. T1(TYPE) MemcAbstract<TYPE>::MemcAbstract() : _Memc(0, null, null) {}
  423. /******************************************************************************/
  424. // MEMC THREAD SAFE
  425. /******************************************************************************/
  426. T1(TYPE) MemcThreadSafe<TYPE>& MemcThreadSafe<TYPE>::clear() {_MemcThreadSafe::clear(); return T;}
  427. T1(TYPE) MemcThreadSafe<TYPE>& MemcThreadSafe<TYPE>::del () {_MemcThreadSafe::del (); return T;}
  428. T1(TYPE) Int MemcThreadSafe<TYPE>::elms ()C {return _MemcThreadSafe::elms ();}
  429. T1(TYPE) UInt MemcThreadSafe<TYPE>::elmSize ()C {return _MemcThreadSafe::elmSize ();}
  430. T1(TYPE) UInt MemcThreadSafe<TYPE>::memUsage()C {return _MemcThreadSafe::memUsage();}
  431. T1(TYPE) TYPE* MemcThreadSafe<TYPE>::lockedData ( ) {DEBUG_ASSERT(elmSize()==SIZE(TYPE) || elms()<=1, "'MemcThreadSafe.data' Can't cast to C++ pointer after using 'replaceClass'."); return (TYPE*)_MemcThreadSafe::lockedData();}
  432. T1(TYPE) TYPE* MemcThreadSafe<TYPE>::lockedAddr (Int i) {return (TYPE*)_MemcThreadSafe::lockedAddr (i);}
  433. T1(TYPE) TYPE& MemcThreadSafe<TYPE>::lockedElm (Int i) {return *(TYPE*)_MemcThreadSafe::lockedElm (i);}
  434. T1(TYPE) TYPE& MemcThreadSafe<TYPE>::lockedFirst( ) {return *(TYPE*)_MemcThreadSafe::lockedFirst( );}
  435. T1(TYPE) TYPE& MemcThreadSafe<TYPE>::lockedLast ( ) {return *(TYPE*)_MemcThreadSafe::lockedLast ( );}
  436. T1(TYPE) TYPE& MemcThreadSafe<TYPE>::lockedNew ( ) {return *(TYPE*)_MemcThreadSafe::lockedNew ( );}
  437. T1(TYPE) TYPE& MemcThreadSafe<TYPE>::lockedNewAt(Int i) {return *(TYPE*)_MemcThreadSafe::lockedNewAt(i);}
  438. T1(TYPE) TYPE MemcThreadSafe<TYPE>::popFirst( Bool keep_order) {lock(); TYPE temp=lockedFirst( ); remove (0, keep_order); unlock(); return temp;}
  439. T1(TYPE) TYPE MemcThreadSafe<TYPE>::pop (Int i, Bool keep_order) {lock(); TYPE temp=lockedElm (i); remove (i, keep_order); unlock(); return temp;}
  440. T1(TYPE) TYPE MemcThreadSafe<TYPE>::pop ( ) {lock(); TYPE temp=lockedLast ( ); removeLast( ); unlock(); return temp;}
  441. T1(TYPE) C TYPE* MemcThreadSafe<TYPE>::lockedData ( )C {return ConstCast(T).lockedData ( );}
  442. T1(TYPE) C TYPE* MemcThreadSafe<TYPE>::lockedAddr (Int i)C {return ConstCast(T).lockedAddr (i);}
  443. T1(TYPE) C TYPE& MemcThreadSafe<TYPE>::lockedElm (Int i)C {return ConstCast(T).lockedElm (i);}
  444. T1(TYPE) C TYPE& MemcThreadSafe<TYPE>::lockedFirst( )C {return ConstCast(T).lockedFirst( );}
  445. T1(TYPE) C TYPE& MemcThreadSafe<TYPE>::lockedLast ( )C {return ConstCast(T).lockedLast ( );}
  446. T1(TYPE) Int MemcThreadSafe<TYPE>::index (C TYPE *elm)C {return _MemcThreadSafe::index (elm);}
  447. T1(TYPE) Bool MemcThreadSafe<TYPE>::contains(C TYPE *elm)C {return _MemcThreadSafe::contains(elm);}
  448. T1(TYPE) MemcThreadSafe<TYPE>& MemcThreadSafe<TYPE>::removeLast( ) {_MemcThreadSafe::removeLast( ); return T;}
  449. T1(TYPE) MemcThreadSafe<TYPE>& MemcThreadSafe<TYPE>::remove ( Int i , Bool keep_order) {_MemcThreadSafe::remove (i , keep_order); return T;}
  450. T1(TYPE) MemcThreadSafe<TYPE>& MemcThreadSafe<TYPE>::removeData(C TYPE *elm, Bool keep_order) {_MemcThreadSafe::removeData(elm, keep_order); return T;}
  451. T1(TYPE) MemcThreadSafe<TYPE>& MemcThreadSafe<TYPE>::setNum (Int num) { _MemcThreadSafe::setNum (num); return T;}
  452. T1(TYPE) MemcThreadSafe<TYPE>& MemcThreadSafe<TYPE>::setNumZero(Int num) { _MemcThreadSafe::setNumZero(num); return T;}
  453. T1(TYPE) Int MemcThreadSafe<TYPE>::addNum (Int num) {return _MemcThreadSafe::addNum (num); }
  454. T1(TYPE) T1(VALUE) Bool MemcThreadSafe<TYPE>::binarySearch(C VALUE &value, Int &index, Int compare(C TYPE &a, C VALUE &b))C {return _MemcThreadSafe::binarySearch(&value, index, (Int(*)(CPtr, CPtr))compare);}
  455. T1(TYPE) MemcThreadSafe<TYPE>& MemcThreadSafe<TYPE>:: sort(Int compare(C TYPE &a, C TYPE &b)) {_MemcThreadSafe:: sort((Int(*)(CPtr, CPtr))compare); return T;}
  456. T1(TYPE) MemcThreadSafe<TYPE>& MemcThreadSafe<TYPE>:: reverseOrder( ) {_MemcThreadSafe:: reverseOrder( ); return T;}
  457. T1(TYPE) MemcThreadSafe<TYPE>& MemcThreadSafe<TYPE>::randomizeOrder( ) {_MemcThreadSafe::randomizeOrder( ); return T;}
  458. T1(TYPE) MemcThreadSafe<TYPE>& MemcThreadSafe<TYPE>:: rotateOrder(Int offset ) {_MemcThreadSafe:: rotateOrder(offset ); return T;}
  459. T1(TYPE) MemcThreadSafe<TYPE>& MemcThreadSafe<TYPE>:: swapOrder(Int i , Int j ) {_MemcThreadSafe:: swapOrder(i, j ); return T;}
  460. T1(TYPE) MemcThreadSafe<TYPE>& MemcThreadSafe<TYPE>:: moveElm (Int elm, Int new_index ) {_MemcThreadSafe:: moveElm (elm, new_index ); return T;}
  461. T1(TYPE) void MemcThreadSafe<TYPE>:: lock()C {_MemcThreadSafe:: lock();}
  462. T1(TYPE) void MemcThreadSafe<TYPE>::unlock()C {_MemcThreadSafe::unlock();}
  463. T1(TYPE) MemcThreadSafe<TYPE>::MemcThreadSafe() : _MemcThreadSafe(SIZE(TYPE), ClassFunc<TYPE>::GetNew(), ClassFunc<TYPE>::GetDel()) {}
  464. /******************************************************************************/
  465. // MEMT
  466. /******************************************************************************/
  467. template<typename TYPE, Int size> Memt<TYPE, size>& Memt<TYPE, size>::clear()
  468. {
  469. if(ClassFunc<TYPE>::HasDel())REPA(T)T[i].~TYPE();
  470. _elms=0;
  471. return T;
  472. }
  473. template<typename TYPE, Int size> Memt<TYPE, size>& Memt<TYPE, size>::del()
  474. {
  475. clear();
  476. if(_data){Free(_data); _max_elms=SIZE(_temp)/elmSize();}
  477. return T;
  478. }
  479. template<typename TYPE, Int size> Int Memt<TYPE, size>::elms ()C {return _elms;}
  480. template<typename TYPE, Int size> UInt Memt<TYPE, size>::elmSize ()C {return SIZE(TYPE);}
  481. template<typename TYPE, Int size> UInt Memt<TYPE, size>::memUsage()C {return SIZE(T) + (_data ? elmSize()*_max_elms : 0);}
  482. template<typename TYPE, Int size> TYPE* Memt<TYPE, size>::data ( ) { return _data ? _data : (TYPE*)_temp ;}
  483. template<typename TYPE, Int size> TYPE& Memt<TYPE, size>::operator[](Int i) { RANGE_ASSERT(i, _elms); return _data ? _data[i] : ((TYPE*)_temp)[i];}
  484. template<typename TYPE, Int size> TYPE* Memt<TYPE, size>::addr (Int i) {return InRange(i, _elms) ? &T[i] : null;}
  485. template<typename TYPE, Int size> TYPE& Memt<TYPE, size>::first ( ) {return T[ 0];}
  486. template<typename TYPE, Int size> TYPE& Memt<TYPE, size>::last ( ) {return T[elms()-1];}
  487. template<typename TYPE, Int size> TYPE Memt<TYPE, size>::popFirst( Bool keep_order) {TYPE temp=first(); remove (0, keep_order); return temp;}
  488. template<typename TYPE, Int size> TYPE Memt<TYPE, size>::pop (Int i, Bool keep_order) {TYPE temp= T[i]; remove (i, keep_order); return temp;}
  489. template<typename TYPE, Int size> TYPE Memt<TYPE, size>::pop ( ) {TYPE temp= last(); removeLast( ); return temp;}
  490. template<typename TYPE, Int size> C TYPE* Memt<TYPE, size>::data ( )C {return ConstCast(T).data ( );}
  491. template<typename TYPE, Int size> C TYPE* Memt<TYPE, size>::addr (Int i)C {return ConstCast(T).addr (i);}
  492. template<typename TYPE, Int size> C TYPE& Memt<TYPE, size>::operator[](Int i)C {return ConstCast(T) [i];}
  493. template<typename TYPE, Int size> C TYPE& Memt<TYPE, size>::first ( )C {return ConstCast(T).first( );}
  494. template<typename TYPE, Int size> C TYPE& Memt<TYPE, size>::last ( )C {return ConstCast(T).last ( );}
  495. template<typename TYPE, Int size> TYPE& Memt<TYPE, size>::operator()(Int i)
  496. {
  497. if(i< 0 )Exit("i<0 inside 'Memt.operator()(Int i)'");
  498. if(i>=elms())setNumZero(i+1);
  499. return T[i];
  500. }
  501. template<typename TYPE, Int size> TYPE& Memt<TYPE, size>::New ( ) {return T[addNum(1)];}
  502. template<typename TYPE, Int size> TYPE& Memt<TYPE, size>::NewAt(Int i)
  503. {
  504. Clamp(i, 0, elms());
  505. Int old_elms=elms(); _elms++;
  506. if(elms()>_max_elms)
  507. {
  508. _max_elms=CeilPow2(elms());
  509. Ptr next=Alloc(_max_elms*elmSize());
  510. Copy((Byte*)next , &T[0], i *elmSize());
  511. Copy((Byte*)next+(i+1)*elmSize(), &T[i], (old_elms-i)*elmSize());
  512. Free(_data); _data=(TYPE*)next;
  513. }else
  514. if(i<old_elms)
  515. {
  516. Copy(&T[i+1], &T[i], (old_elms-i)*elmSize());
  517. }
  518. TYPE &elm=T[i]; new(&elm)TYPE; return elm;
  519. }
  520. template<typename TYPE, Int size> Int Memt<TYPE, size>::index(C TYPE *elm)C
  521. {
  522. UIntPtr i=UIntPtr(elm)-UIntPtr(data());
  523. if(i<UIntPtr(elms()*elmSize()))return i/elmSize(); // unsigned compare will already guarantee "i>=0 && "
  524. return -1;
  525. }
  526. template<typename TYPE, Int size> Bool Memt<TYPE, size>::contains(C TYPE *elm)C {return index(elm)>=0;}
  527. template<typename TYPE, Int size> Memt<TYPE, size>& Memt<TYPE, size>::remove(Int i, Bool keep_order)
  528. {
  529. if(InRange(i, T))
  530. {
  531. T[i].~TYPE();
  532. if(i<elms()-1) // if this is not the last element
  533. {
  534. if(keep_order)Copy(&T[i], &T[ i+1], elmSize()*(elms()-i-1));
  535. else Copy(&T[i], &T[elms()-1], elmSize());
  536. }
  537. _elms--;
  538. }
  539. return T;
  540. }
  541. template<typename TYPE, Int size> Memt<TYPE, size>& Memt<TYPE, size>::removeLast( ) {return remove(elms()-1 );}
  542. template<typename TYPE, Int size> Memt<TYPE, size>& Memt<TYPE, size>::removeData(C TYPE *elm, Bool keep_order) {return remove(index(elm), keep_order);}
  543. template<typename TYPE, Int size> Memt<TYPE, size>& Memt<TYPE, size>::reserve(Int num)
  544. {
  545. if(num>_max_elms)
  546. {
  547. _max_elms=CeilPow2(num);
  548. Ptr next=Alloc(_max_elms*elmSize());
  549. Copy(next, data(), elms()*elmSize());
  550. Free(_data); _data=(TYPE*)next;
  551. }
  552. return T;
  553. }
  554. template<typename TYPE, Int size> Memt<TYPE, size>& Memt<TYPE, size>::setNum(Int num)
  555. {
  556. MAX(num, 0);
  557. if( num>elms()) // add elements
  558. {
  559. reserve(num);
  560. Int old_elms=elms(); _elms=num;
  561. if(ClassFunc<TYPE>::HasNew())for(Int i=old_elms; i<elms(); i++)new(&T[i])TYPE;
  562. }else
  563. if(num<elms()) // remove elements
  564. {
  565. if(ClassFunc<TYPE>::HasDel())for(Int i=num; i<elms(); i++)T[i].~TYPE();
  566. _elms=num;
  567. }
  568. return T;
  569. }
  570. template<typename TYPE, Int size> Memt<TYPE, size>& Memt<TYPE, size>::setNumZero(Int num)
  571. {
  572. MAX(num, 0);
  573. if( num>elms()) // add elements
  574. {
  575. reserve(num);
  576. Int old_elms=elms(); _elms=num;
  577. Zero(&T[old_elms], elmSize()*(elms()-old_elms));
  578. if(ClassFunc<TYPE>::HasNew())for(Int i=old_elms; i<elms(); i++)new(&T[i])TYPE;
  579. }else
  580. if(num<elms()) // remove elements
  581. {
  582. if(ClassFunc<TYPE>::HasDel())for(Int i=num; i<elms(); i++)T[i].~TYPE();
  583. _elms=num;
  584. }
  585. return T;
  586. }
  587. template<typename TYPE, Int size> Int Memt<TYPE, size>::addNum(Int num) {Int index=elms(); setNum(elms()+num); return index;}
  588. template<typename TYPE, Int size> T1(VALUE) Bool Memt<TYPE, size>::binarySearch(C VALUE &value, Int &index, Int compare(C TYPE &a, C VALUE &b))C {return _BinarySearch(data(), elms(), elmSize(), &value, index, (Int(*)(CPtr, CPtr))compare);}
  589. template<typename TYPE, Int size> Memt<TYPE, size>& Memt<TYPE, size>::sort(Int compare(C TYPE &a, C TYPE &b)) {_Sort(data(), elms(), elmSize(), (Int(*)(CPtr, CPtr))compare); return T;}
  590. template<typename TYPE, Int size> Memt<TYPE, size>& Memt<TYPE, size>:: reverseOrder( ) { _ReverseOrder(data(), elms(), elmSize() ); return T;}
  591. template<typename TYPE, Int size> Memt<TYPE, size>& Memt<TYPE, size>::randomizeOrder( ) {_RandomizeOrder(data(), elms(), elmSize() ); return T;}
  592. template<typename TYPE, Int size> Memt<TYPE, size>& Memt<TYPE, size>:: rotateOrder(Int offset ) { _RotateOrder(data(), elms(), elmSize(), offset ); return T;}
  593. template<typename TYPE, Int size> Memt<TYPE, size>& Memt<TYPE, size>:: moveElm (Int elm, Int new_index) { _MoveElm (data(), elms(), elmSize(), elm, new_index); return T;}
  594. template<typename TYPE, Int size> Memt<TYPE, size>& Memt<TYPE, size>:: swapOrder(Int i , Int j ) {if(InRange(i, T) && InRange(j, T)) Swap(T[i], T[j]); return T;}
  595. template<typename TYPE, Int size> Memt<TYPE, size>& Memt<TYPE, size>::operator=(C Mems <TYPE > &src) { setNum(src.elms()); FREPAO(T)=src[i]; return T;}
  596. template<typename TYPE, Int size> Memt<TYPE, size>& Memt<TYPE, size>::operator=(C Memc <TYPE > &src) { setNum(src.elms()); FREPAO(T)=src[i]; return T;}
  597. template<typename TYPE, Int size> Memt<TYPE, size>& Memt<TYPE, size>::operator=(C Memt <TYPE, size> &src) {if(this!=Ptr(&src )){setNum(src.elms()); FREPAO(T)=src[i];} return T;}
  598. template<typename TYPE, Int size> template<Int src_size> Memt<TYPE, size>& Memt<TYPE, size>::operator=(C Memt <TYPE, src_size> &src) {if(this!=Ptr(&src )){setNum(src.elms()); FREPAO(T)=src[i];} return T;}
  599. template<typename TYPE, Int size> Memt<TYPE, size>& Memt<TYPE, size>::operator=(C Memb <TYPE > &src) { setNum(src.elms()); FREPAO(T)=src[i]; return T;}
  600. template<typename TYPE, Int size> Memt<TYPE, size>& Memt<TYPE, size>::operator=(C Memx <TYPE > &src) { setNum(src.elms()); FREPAO(T)=src[i]; return T;}
  601. template<typename TYPE, Int size> Memt<TYPE, size>& Memt<TYPE, size>::operator=(C Meml <TYPE > &src) { setNum(src.elms()); FREPAO(T)=src[i]; return T;}
  602. template<typename TYPE, Int size> template<Int src_size> Memt<TYPE, size>& Memt<TYPE, size>::operator=(C MemPtr<TYPE, src_size> &src) {if(this!=Ptr(src._memt)){setNum(src.elms()); FREPAO(T)=src[i];} return T;}
  603. template<typename TYPE, Int Memt_elms> MemtN<TYPE, Memt_elms>& MemtN<TYPE, Memt_elms>::operator=(C Mems <TYPE > &src) {Memt<TYPE, SIZE(TYPE)*Memt_elms>::operator=(src); return T;}
  604. template<typename TYPE, Int Memt_elms> MemtN<TYPE, Memt_elms>& MemtN<TYPE, Memt_elms>::operator=(C Memc <TYPE > &src) {Memt<TYPE, SIZE(TYPE)*Memt_elms>::operator=(src); return T;}
  605. template<typename TYPE, Int Memt_elms> template<Int src_size> MemtN<TYPE, Memt_elms>& MemtN<TYPE, Memt_elms>::operator=(C Memt <TYPE, src_size> &src) {Memt<TYPE, SIZE(TYPE)*Memt_elms>::operator=(src); return T;}
  606. template<typename TYPE, Int Memt_elms> MemtN<TYPE, Memt_elms>& MemtN<TYPE, Memt_elms>::operator=(C MemtN <TYPE, Memt_elms> &src) {Memt<TYPE, SIZE(TYPE)*Memt_elms>::operator=(src); return T;}
  607. template<typename TYPE, Int Memt_elms> MemtN<TYPE, Memt_elms>& MemtN<TYPE, Memt_elms>::operator=(C Memb <TYPE > &src) {Memt<TYPE, SIZE(TYPE)*Memt_elms>::operator=(src); return T;}
  608. template<typename TYPE, Int Memt_elms> MemtN<TYPE, Memt_elms>& MemtN<TYPE, Memt_elms>::operator=(C Memx <TYPE > &src) {Memt<TYPE, SIZE(TYPE)*Memt_elms>::operator=(src); return T;}
  609. template<typename TYPE, Int Memt_elms> MemtN<TYPE, Memt_elms>& MemtN<TYPE, Memt_elms>::operator=(C Meml <TYPE > &src) {Memt<TYPE, SIZE(TYPE)*Memt_elms>::operator=(src); return T;}
  610. template<typename TYPE, Int Memt_elms> template<Int src_size> MemtN<TYPE, Memt_elms>& MemtN<TYPE, Memt_elms>::operator=(C MemPtr<TYPE, src_size> &src) {Memt<TYPE, SIZE(TYPE)*Memt_elms>::operator=(src); return T;}
  611. template<typename TYPE, Int size> Bool Memt<TYPE, size>::save(File &f)C { f.cmpUIntV(elms()) ; FREPA(T)if(!T[i].save(f))return false; return f.ok();}
  612. template<typename TYPE, Int size> Bool Memt<TYPE, size>::save(File &f) { f.cmpUIntV(elms()) ; FREPA(T)if(!T[i].save(f))return false; return f.ok();}
  613. template<typename TYPE, Int size> Bool Memt<TYPE, size>::load(File &f) {setNum(f.decUIntV( )); FREPA(T)if(!T[i].load(f))goto error; if(f.ok())return true; error: clear(); return false;}
  614. template<typename TYPE, Int size> Bool Memt<TYPE, size>::saveRawData(File &f)C {return f.putN(data(), elms());}
  615. template<typename TYPE, Int size> Bool Memt<TYPE, size>::loadRawData(File &f) {return f.getN(data(), elms());}
  616. template<typename TYPE, Int size> Bool Memt<TYPE, size>::saveRaw(File &f)C { f.cmpUIntV(elms()) ; saveRawData(f); return f.ok();}
  617. template<typename TYPE, Int size> Bool Memt<TYPE, size>::loadRaw(File &f) {setNum(f.decUIntV( )); loadRawData(f); if(f.ok())return true; clear(); return false;}
  618. #if EE_PRIVATE
  619. template<typename TYPE, Int size> Bool Memt<TYPE, size>::loadRawDataFast(File &f) {return f.getFastN(data(), elms());}
  620. template<typename TYPE, Int size> Bool Memt<TYPE, size>::_saveRaw(File &f)C { f.putInt (elms()) ; saveRawData(f); return f.ok();}
  621. template<typename TYPE, Int size> Bool Memt<TYPE, size>::_loadRaw(File &f) {setNum(f.getInt ( )); loadRawData(f); if(f.ok())return true; clear(); return false;}
  622. #endif
  623. template<typename TYPE, Int size> Memt<TYPE, size>::~Memt( ) {del();}
  624. template<typename TYPE, Int size> Memt<TYPE, size>:: Memt( ) {_data=null; _elms=0; _max_elms=SIZE(_temp)/elmSize();} // '_data' being set to 'null' instead of '_temp' allows for moving 'Memt' into another memory address
  625. template<typename TYPE, Int size> Memt<TYPE, size>:: Memt(C Memt &src) : Memt() {T=src;}
  626. /******************************************************************************/
  627. // MEMB
  628. /******************************************************************************/
  629. T1(TYPE) Memb<TYPE>& Memb<TYPE>::clear() {_Memb::clear(); return T;}
  630. T1(TYPE) Memb<TYPE>& Memb<TYPE>::del () {_Memb::del (); return T;}
  631. T1(TYPE) Int Memb<TYPE>:: elms ()C {return _Memb:: elms ();}
  632. T1(TYPE) UInt Memb<TYPE>:: elmSize ()C {return _Memb:: elmSize ();}
  633. T1(TYPE) UInt Memb<TYPE>::blockElms ()C {return _Memb::blockElms ();}
  634. T1(TYPE) UInt Memb<TYPE>:: memUsage()C {return _Memb:: memUsage();}
  635. T1(TYPE) TYPE* Memb<TYPE>::addr (Int i) {return (TYPE*)_Memb::addr (i);}
  636. T1(TYPE) TYPE& Memb<TYPE>::operator[](Int i) {return *(TYPE*)_Memb::operator[](i);}
  637. T1(TYPE) TYPE& Memb<TYPE>::operator()(Int i) {return *(TYPE*)_Memb::operator()(i);}
  638. T1(TYPE) TYPE& Memb<TYPE>::first ( ) {return *(TYPE*)_Memb::first ( );}
  639. T1(TYPE) TYPE& Memb<TYPE>::last ( ) {return *(TYPE*)_Memb::last ( );}
  640. T1(TYPE) TYPE& Memb<TYPE>::New ( ) {return *(TYPE*)_Memb::New ( );}
  641. T1(TYPE) TYPE& Memb<TYPE>::NewAt (Int i) {return *(TYPE*)_Memb::NewAt (i);}
  642. T1(TYPE) TYPE Memb<TYPE>::popFirst( Bool keep_order) {TYPE temp=first(); remove (0, keep_order); return temp;}
  643. T1(TYPE) TYPE Memb<TYPE>::pop (Int i, Bool keep_order) {TYPE temp= T[i]; remove (i, keep_order); return temp;}
  644. T1(TYPE) TYPE Memb<TYPE>::pop ( ) {TYPE temp= last(); removeLast( ); return temp;}
  645. T1(TYPE) C TYPE* Memb<TYPE>::addr (Int i)C {return ConstCast(T).addr (i);}
  646. T1(TYPE) C TYPE& Memb<TYPE>::operator[](Int i)C {return ConstCast(T) [i];}
  647. T1(TYPE) C TYPE& Memb<TYPE>::first ( )C {return ConstCast(T).first( );}
  648. T1(TYPE) C TYPE& Memb<TYPE>::last ( )C {return ConstCast(T).last ( );}
  649. T1(TYPE) Int Memb<TYPE>::index (C TYPE *elm)C {return _Memb::index (elm);}
  650. T1(TYPE) Bool Memb<TYPE>::contains(C TYPE *elm)C {return _Memb::contains(elm);}
  651. T1(TYPE) Memb<TYPE>& Memb<TYPE>::removeLast( ) {_Memb::removeLast( ); return T;}
  652. T1(TYPE) Memb<TYPE>& Memb<TYPE>::remove ( Int i , Bool keep_order) {_Memb::remove (i , keep_order); return T;}
  653. T1(TYPE) Memb<TYPE>& Memb<TYPE>::removeData(C TYPE *elm, Bool keep_order) {_Memb::removeData(elm, keep_order); return T;}
  654. T1(TYPE) Memb<TYPE>& Memb<TYPE>::setNum (Int num) { _Memb::setNum (num); return T;}
  655. T1(TYPE) Memb<TYPE>& Memb<TYPE>::setNumZero(Int num) { _Memb::setNumZero(num); return T;}
  656. T1(TYPE) Int Memb<TYPE>::addNum (Int num) {return _Memb::addNum (num); }
  657. T1(TYPE) T1(VALUE) Bool Memb<TYPE>::binarySearch(C VALUE &value, Int &index, Int compare(C TYPE &a, C VALUE &b))C {return _BinarySearch(T, &value, index, (Int(*)(CPtr, CPtr))compare);}
  658. T1(TYPE) Memb<TYPE>& Memb<TYPE>::sort(Int compare(C TYPE &a, C TYPE &b)) {_Sort(T, (Int(*)(CPtr, CPtr))compare); return T;}
  659. T1(TYPE) Memb<TYPE>& Memb<TYPE>::reverseOrder( ) {_Memb::reverseOrder( ); return T;}
  660. T1(TYPE) Memb<TYPE>& Memb<TYPE>:: swapOrder(Int i , Int j ) {_Memb:: swapOrder(i , j ); return T;}
  661. T1(TYPE) Memb<TYPE>& Memb<TYPE>:: moveElm(Int elm, Int new_index) {_Memb:: moveElm(elm, new_index); return T;}
  662. T1(TYPE) Memb<TYPE>& Memb<TYPE>::operator=(C Mems <TYPE > &src) { setNum(src.elms()); FREPAO(T)=src[i]; return T;}
  663. T1(TYPE) Memb<TYPE>& Memb<TYPE>::operator=(C Memc <TYPE > &src) { setNum(src.elms()); FREPAO(T)=src[i]; return T;}
  664. T1(TYPE) template<Int size> Memb<TYPE>& Memb<TYPE>::operator=(C Memt <TYPE, size> &src) { setNum(src.elms()); FREPAO(T)=src[i]; return T;}
  665. T1(TYPE) Memb<TYPE>& Memb<TYPE>::operator=(C Memb <TYPE > &src) {if(this!=&src ){setNum(src.elms()); FREPAO(T)=src[i];} return T;}
  666. T1(TYPE) Memb<TYPE>& Memb<TYPE>::operator=(C Memx <TYPE > &src) { setNum(src.elms()); FREPAO(T)=src[i]; return T;}
  667. T1(TYPE) Memb<TYPE>& Memb<TYPE>::operator=(C Meml <TYPE > &src) { setNum(src.elms()); FREPAO(T)=src[i]; return T;}
  668. T1(TYPE) template<Int size> Memb<TYPE>& Memb<TYPE>::operator=(C MemPtr<TYPE, size> &src) {if(this!=src._memb){setNum(src.elms()); FREPAO(T)=src[i];} return T;}
  669. T1(TYPE) Memb<TYPE>& Memb<TYPE>::operator=( Memb <TYPE > &&src) {Swap(T, src); return T;}
  670. T1(TYPE) T1(EXTENDED) Memb<TYPE>& Memb<TYPE>::replaceClass () {ASSERT_BASE_EXTENDED<TYPE, EXTENDED>(); _Memb::_reset(SIZE(EXTENDED), _block_elms, ClassFunc<EXTENDED>::GetNew(), ClassFunc<EXTENDED>::GetDel()); return T;}
  671. T1(TYPE) T1(BASE ) Memb<TYPE>::operator Memb<BASE>&() {ASSERT_BASE_EXTENDED<BASE, TYPE >(); return *( Memb<BASE>*)this;}
  672. T1(TYPE) T1(BASE ) Memb<TYPE>::operator C Memb<BASE>&()C {ASSERT_BASE_EXTENDED<BASE, TYPE >(); return *(C Memb<BASE>*)this;}
  673. T1(TYPE) Bool Memb<TYPE>::save(File &f)C { f.cmpUIntV(elms()) ; FREPA(T)if(!T[i].save(f))return false; return f.ok();}
  674. T1(TYPE) Bool Memb<TYPE>::save(File &f) { f.cmpUIntV(elms()) ; FREPA(T)if(!T[i].save(f))return false; return f.ok();}
  675. T1(TYPE) Bool Memb<TYPE>::load(File &f) {setNum(f.decUIntV( )); FREPA(T)if(!T[i].load(f))goto error; if(f.ok())return true; error: clear(); return false;}
  676. T1(TYPE) Bool Memb<TYPE>::saveRaw(File &f)C {return _Memb::saveRaw(f);}
  677. T1(TYPE) Bool Memb<TYPE>::loadRaw(File &f) {return _Memb::loadRaw(f);}
  678. T1(TYPE) Memb<TYPE>::Memb(Int block_elms) : _Memb(SIZE(TYPE) , block_elms , ClassFunc<TYPE>::GetNew(), ClassFunc<TYPE>::GetDel()) {}
  679. T1(TYPE) Memb<TYPE>::Memb(C Memb &src ) : _Memb(src.elmSize(), src.blockElms(), src._new , src._del ) {T=src;}
  680. T1(TYPE) Memb<TYPE>::Memb( Memb &&src ) : _Memb( 0, 0, null , null ) {Swap(T, src);}
  681. /******************************************************************************/
  682. // MEMB ABSTRACT
  683. /******************************************************************************/
  684. T1(TYPE) MembAbstract<TYPE>& MembAbstract<TYPE>::clear() {_Memb::clear(); return T;}
  685. T1(TYPE) MembAbstract<TYPE>& MembAbstract<TYPE>::del () {_Memb::del (); return T;}
  686. T1(TYPE) Int MembAbstract<TYPE>:: elms ()C {return _Memb:: elms ();}
  687. T1(TYPE) UInt MembAbstract<TYPE>:: elmSize()C {return _Memb:: elmSize();}
  688. T1(TYPE) UInt MembAbstract<TYPE>::blockElms()C {return _Memb::blockElms();}
  689. T1(TYPE) TYPE* MembAbstract<TYPE>::addr (Int i) {return (TYPE*)_Memb::addr (i);}
  690. T1(TYPE) TYPE& MembAbstract<TYPE>::operator[](Int i) {return *(TYPE*)_Memb::operator[](i);}
  691. T1(TYPE) TYPE& MembAbstract<TYPE>::operator()(Int i) {return *(TYPE*)_Memb::operator()(i);}
  692. T1(TYPE) TYPE& MembAbstract<TYPE>::first ( ) {return *(TYPE*)_Memb::first ( );}
  693. T1(TYPE) TYPE& MembAbstract<TYPE>::last ( ) {return *(TYPE*)_Memb::last ( );}
  694. T1(TYPE) TYPE& MembAbstract<TYPE>::New ( ) {return *(TYPE*)_Memb::New ( );}
  695. T1(TYPE) TYPE& MembAbstract<TYPE>::NewAt (Int i) {return *(TYPE*)_Memb::NewAt (i);}
  696. T1(TYPE) C TYPE* MembAbstract<TYPE>::addr (Int i)C {return ConstCast(T).addr (i);}
  697. T1(TYPE) C TYPE& MembAbstract<TYPE>::operator[](Int i)C {return ConstCast(T) [i];}
  698. T1(TYPE) C TYPE& MembAbstract<TYPE>::first ( )C {return ConstCast(T).first( );}
  699. T1(TYPE) C TYPE& MembAbstract<TYPE>::last ( )C {return ConstCast(T).last ( );}
  700. T1(TYPE) Int MembAbstract<TYPE>::index (C TYPE *elm)C {return _Memb::index (elm);}
  701. T1(TYPE) Bool MembAbstract<TYPE>::contains(C TYPE *elm)C {return _Memb::contains(elm);}
  702. T1(TYPE) MembAbstract<TYPE>& MembAbstract<TYPE>::removeLast( ) {_Memb::removeLast( ); return T;}
  703. T1(TYPE) MembAbstract<TYPE>& MembAbstract<TYPE>::remove ( Int i , Bool keep_order) {_Memb::remove (i , keep_order); return T;}
  704. T1(TYPE) MembAbstract<TYPE>& MembAbstract<TYPE>::removeData(C TYPE *elm, Bool keep_order) {_Memb::removeData(elm, keep_order); return T;}
  705. T1(TYPE) MembAbstract<TYPE>& MembAbstract<TYPE>::setNum (Int num) { _Memb::setNum (num); return T;}
  706. T1(TYPE) MembAbstract<TYPE>& MembAbstract<TYPE>::setNumZero(Int num) { _Memb::setNumZero(num); return T;}
  707. T1(TYPE) Int MembAbstract<TYPE>::addNum (Int num) {return _Memb::addNum (num); }
  708. T1(TYPE) T1(EXTENDED) MembAbstract<TYPE>& MembAbstract<TYPE>::replaceClass () {ASSERT_BASE_EXTENDED<TYPE, EXTENDED>(); _Memb::_reset(SIZE(EXTENDED), _block_elms, ClassFunc<EXTENDED>::GetNew(), ClassFunc<EXTENDED>::GetDel()); return T;}
  709. T1(TYPE) T1(BASE ) MembAbstract<TYPE>::operator Memb<BASE>&() {ASSERT_BASE_EXTENDED<BASE, TYPE >(); return *( Memb<BASE>*)this;}
  710. T1(TYPE) T1(BASE ) MembAbstract<TYPE>::operator C Memb<BASE>&()C {ASSERT_BASE_EXTENDED<BASE, TYPE >(); return *(C Memb<BASE>*)this;}
  711. T1(TYPE) MembAbstract<TYPE>::MembAbstract(Int block_elms) : _Memb(0, block_elms, null, null) {}
  712. /******************************************************************************/
  713. // MEMB CONST
  714. /******************************************************************************/
  715. T1(TYPE) TYPE* MembConst<TYPE>::addr (Int i)C {return ConstCast(T).Memb<TYPE>::addr (i);}
  716. T1(TYPE) TYPE& MembConst<TYPE>::operator[](Int i)C {return ConstCast(T).Memb<TYPE>::operator[](i);}
  717. T1(TYPE) TYPE& MembConst<TYPE>::first ( )C {return ConstCast(T).Memb<TYPE>::first ( );}
  718. T1(TYPE) TYPE& MembConst<TYPE>::last ( )C {return ConstCast(T).Memb<TYPE>::last ( );}
  719. T1(TYPE) T1(BASE) MembConst<TYPE>::operator MembConst<BASE>&() {ASSERT_BASE_EXTENDED<BASE, TYPE>(); return *( MembConst<BASE>*)this;}
  720. T1(TYPE) T1(BASE) MembConst<TYPE>::operator C MembConst<BASE>&()C {ASSERT_BASE_EXTENDED<BASE, TYPE>(); return *(C MembConst<BASE>*)this;}
  721. /******************************************************************************/
  722. // MEMX
  723. /******************************************************************************/
  724. T1(TYPE) Memx<TYPE>& Memx<TYPE>::clear() {_Memx::clear(); return T;}
  725. T1(TYPE) Memx<TYPE>& Memx<TYPE>::del () {_Memx::del (); return T;}
  726. T1(TYPE) Int Memx<TYPE>:: absElms ()C {return _Memx:: absElms ();}
  727. T1(TYPE) Int Memx<TYPE>::validElms ()C {return _Memx::validElms ();}
  728. T1(TYPE) Int Memx<TYPE>:: elms ()C {return _Memx:: elms ();}
  729. T1(TYPE) UInt Memx<TYPE>:: elmSize ()C {return _Memx:: elmSize ();}
  730. T1(TYPE) UInt Memx<TYPE>:: memUsage()C {return _Memx:: memUsage();}
  731. T1(TYPE) TYPE& Memx<TYPE>:: absElm(Int i) {return *(TYPE*)_Memx:: absElm(i);}
  732. T1(TYPE) TYPE& Memx<TYPE>:: validElm(Int i) {return *(TYPE*)_Memx:: validElm(i);}
  733. T1(TYPE) TYPE* Memx<TYPE>:: addr(Int i) {return (TYPE*)_Memx:: addr(i);}
  734. T1(TYPE) TYPE& Memx<TYPE>::operator[](Int i) {return *(TYPE*)_Memx::operator[](i);}
  735. T1(TYPE) TYPE& Memx<TYPE>:: first( ) {return *(TYPE*)_Memx:: first( );}
  736. T1(TYPE) TYPE& Memx<TYPE>:: last( ) {return *(TYPE*)_Memx:: last( );}
  737. T1(TYPE) TYPE& Memx<TYPE>:: New ( ) {return *(TYPE*)_Memx:: New ( );}
  738. T1(TYPE) TYPE& Memx<TYPE>:: NewAt(Int i) {return *(TYPE*)_Memx:: NewAt(i);}
  739. T1(TYPE) C TYPE& Memx<TYPE>:: absElm(Int i)C {return ConstCast(T). absElm(i);}
  740. T1(TYPE) C TYPE& Memx<TYPE>:: validElm(Int i)C {return ConstCast(T).validElm(i);}
  741. T1(TYPE) C TYPE* Memx<TYPE>:: addr(Int i)C {return ConstCast(T). addr(i);}
  742. T1(TYPE) C TYPE& Memx<TYPE>::operator[](Int i)C {return ConstCast(T) [i];}
  743. T1(TYPE) C TYPE& Memx<TYPE>:: first( )C {return ConstCast(T). first( );}
  744. T1(TYPE) C TYPE& Memx<TYPE>:: last( )C {return ConstCast(T). last( );}
  745. T1(TYPE) Int Memx<TYPE>::validToAbsIndex( Int valid)C {return _Memx::validToAbsIndex(valid);}
  746. T1(TYPE) Int Memx<TYPE>::absToValidIndex( Int abs)C {return _Memx::absToValidIndex(abs );}
  747. T1(TYPE) Int Memx<TYPE>::validIndex (C TYPE *elm)C {return _Memx::validIndex (elm );}
  748. T1(TYPE) Int Memx<TYPE>:: absIndex (C TYPE *elm)C {return _Memx:: absIndex (elm );}
  749. T1(TYPE) Bool Memx<TYPE>:: contains (C TYPE *elm)C {return _Memx:: contains (elm );}
  750. T1(TYPE) Memx<TYPE>& Memx<TYPE>::removeAbs ( Int i , Bool keep_order) {_Memx::removeAbs (i , keep_order); return T;}
  751. T1(TYPE) Memx<TYPE>& Memx<TYPE>::removeValid( Int i , Bool keep_order) {_Memx::removeValid(i , keep_order); return T;}
  752. T1(TYPE) Memx<TYPE>& Memx<TYPE>::removeData (C TYPE *elm, Bool keep_order) {_Memx::removeData (elm, keep_order); return T;}
  753. T1(TYPE) Memx<TYPE>& Memx<TYPE>::removeLast ( ) {_Memx::removeLast ( ); return T;}
  754. T1(TYPE) T1(VALUE) Bool Memx<TYPE>::binarySearch(C VALUE &value, Int &index, Int compare(C TYPE &a, C VALUE &b))C {return _BinarySearch(T, &value, index, (Int(*)(CPtr, CPtr))compare);}
  755. T1(TYPE) Memx<TYPE>& Memx<TYPE>::sort(Int compare(C TYPE &a, C TYPE &b)) {_Sort(T, (Int(*)(CPtr, CPtr))compare); return T;}
  756. T1(TYPE) Memx<TYPE>& Memx<TYPE>::reverseOrder( ) {_Memx::reverseOrder( ); return T;}
  757. T1(TYPE) Memx<TYPE>& Memx<TYPE>:: swapOrder(Int i , Int j ) {_Memx:: swapOrder(i , j ); return T;}
  758. T1(TYPE) Memx<TYPE>& Memx<TYPE>::moveElm (Int elm, Int new_index) {_Memx::moveElm (elm, new_index); return T;}
  759. T1(TYPE) Memx<TYPE>& Memx<TYPE>::moveToStart (Int elm ) {_Memx::moveToStart (elm ); return T;}
  760. T1(TYPE) Memx<TYPE>& Memx<TYPE>::moveToEnd (Int elm ) {_Memx::moveToEnd (elm ); return T;}
  761. T1(TYPE) Memx<TYPE>& Memx<TYPE>::operator=(C Mems <TYPE > &src) { setNum(src.elms()); FREPAO(T)=src[i]; return T;}
  762. T1(TYPE) Memx<TYPE>& Memx<TYPE>::operator=(C Memc <TYPE > &src) { setNum(src.elms()); FREPAO(T)=src[i]; return T;}
  763. T1(TYPE) template<Int size> Memx<TYPE>& Memx<TYPE>::operator=(C Memt <TYPE, size> &src) { setNum(src.elms()); FREPAO(T)=src[i]; return T;}
  764. T1(TYPE) Memx<TYPE>& Memx<TYPE>::operator=(C Memb <TYPE > &src) { setNum(src.elms()); FREPAO(T)=src[i]; return T;}
  765. T1(TYPE) Memx<TYPE>& Memx<TYPE>::operator=(C Memx <TYPE > &src) {if(this!=&src ){setNum(src.elms()); FREPAO(T)=src[i];} return T;}
  766. T1(TYPE) Memx<TYPE>& Memx<TYPE>::operator=(C Meml <TYPE > &src) { setNum(src.elms()); FREPAO(T)=src[i]; return T;}
  767. T1(TYPE) template<Int size> Memx<TYPE>& Memx<TYPE>::operator=(C MemPtr<TYPE, size> &src) {if(this!=src._memx){setNum(src.elms()); FREPAO(T)=src[i];} return T;}
  768. T1(TYPE) Memx<TYPE>& Memx<TYPE>::operator=( Memx <TYPE > &&src) {Swap(T, src); return T;}
  769. T1(TYPE) T1(EXTENDED) Memx<TYPE>& Memx<TYPE>::replaceClass () {ASSERT_BASE_EXTENDED<TYPE, EXTENDED>(); _Memx::_reset(SIZE(EXTENDED), _abs.blockElms(), ClassFunc<EXTENDED>::GetNew(), ClassFunc<EXTENDED>::GetDel()); return T;}
  770. T1(TYPE) T1(BASE ) Memx<TYPE>::operator Memx<BASE>&() {ASSERT_BASE_EXTENDED<BASE, TYPE >(); return *( Memx<BASE>*)this;}
  771. T1(TYPE) T1(BASE ) Memx<TYPE>::operator C Memx<BASE>&()C {ASSERT_BASE_EXTENDED<BASE, TYPE >(); return *(C Memx<BASE>*)this;}
  772. T1(TYPE) Bool Memx<TYPE>::save(File &f)C { f.cmpUIntV(elms()) ; FREPA(T)if(!T[i].save(f))return false; return f.ok();}
  773. T1(TYPE) Bool Memx<TYPE>::save(File &f) { f.cmpUIntV(elms()) ; FREPA(T)if(!T[i].save(f))return false; return f.ok();}
  774. T1(TYPE) Bool Memx<TYPE>::load(File &f) {setNum(f.decUIntV( )); FREPA(T)if(!T[i].load(f))goto error; if(f.ok())return true; error: clear(); return false;}
  775. T1(TYPE) Memx<TYPE>::Memx(Int block_elms) : _Memx(SIZE(TYPE) , block_elms , ClassFunc<TYPE>::GetNew(), ClassFunc<TYPE>::GetDel()) {}
  776. T1(TYPE) Memx<TYPE>::Memx(C Memx &src ) : _Memx(src.elmSize(), src._abs.blockElms(), src._new , src._del ) {T=src;}
  777. T1(TYPE) Memx<TYPE>::Memx( Memx &&src ) : _Memx( 0, 0, null , null ) {Swap(T, src);}
  778. /******************************************************************************/
  779. // MEMX ABSTRACT
  780. /******************************************************************************/
  781. T1(TYPE) MemxAbstract<TYPE>& MemxAbstract<TYPE>::clear() {_Memx::clear(); return T;}
  782. T1(TYPE) MemxAbstract<TYPE>& MemxAbstract<TYPE>::del () {_Memx::del (); return T;}
  783. T1(TYPE) Int MemxAbstract<TYPE>:: absElms ()C {return _Memx:: absElms ();}
  784. T1(TYPE) Int MemxAbstract<TYPE>::validElms ()C {return _Memx::validElms ();}
  785. T1(TYPE) Int MemxAbstract<TYPE>:: elms ()C {return _Memx:: elms ();}
  786. T1(TYPE) UInt MemxAbstract<TYPE>:: elmSize ()C {return _Memx:: elmSize ();}
  787. T1(TYPE) UInt MemxAbstract<TYPE>:: memUsage()C {return _Memx:: memUsage();}
  788. T1(TYPE) TYPE& MemxAbstract<TYPE>:: absElm(Int i) {return *(TYPE*)_Memx:: absElm(i);}
  789. T1(TYPE) TYPE& MemxAbstract<TYPE>:: validElm(Int i) {return *(TYPE*)_Memx:: validElm(i);}
  790. T1(TYPE) TYPE* MemxAbstract<TYPE>:: addr(Int i) {return (TYPE*)_Memx:: addr(i);}
  791. T1(TYPE) TYPE& MemxAbstract<TYPE>::operator[](Int i) {return *(TYPE*)_Memx::operator[](i);}
  792. T1(TYPE) TYPE& MemxAbstract<TYPE>:: first( ) {return *(TYPE*)_Memx:: first( );}
  793. T1(TYPE) TYPE& MemxAbstract<TYPE>:: last( ) {return *(TYPE*)_Memx:: last( );}
  794. T1(TYPE) TYPE& MemxAbstract<TYPE>:: New ( ) {return *(TYPE*)_Memx:: New ( );}
  795. T1(TYPE) TYPE& MemxAbstract<TYPE>:: NewAt(Int i) {return *(TYPE*)_Memx:: NewAt(i);}
  796. T1(TYPE) C TYPE& MemxAbstract<TYPE>:: absElm(Int i)C {return ConstCast(T). absElm(i);}
  797. T1(TYPE) C TYPE& MemxAbstract<TYPE>:: validElm(Int i)C {return ConstCast(T).validElm(i);}
  798. T1(TYPE) C TYPE* MemxAbstract<TYPE>:: addr(Int i)C {return ConstCast(T). addr(i);}
  799. T1(TYPE) C TYPE& MemxAbstract<TYPE>::operator[](Int i)C {return ConstCast(T) [i];}
  800. T1(TYPE) C TYPE& MemxAbstract<TYPE>:: first( )C {return ConstCast(T). first( );}
  801. T1(TYPE) C TYPE& MemxAbstract<TYPE>:: last( )C {return ConstCast(T). last( );}
  802. T1(TYPE) Int MemxAbstract<TYPE>::validToAbsIndex( Int valid)C {return _Memx::validToAbsIndex(valid);}
  803. T1(TYPE) Int MemxAbstract<TYPE>::absToValidIndex( Int abs)C {return _Memx::absToValidIndex(abs );}
  804. T1(TYPE) Int MemxAbstract<TYPE>::validIndex (C TYPE *elm)C {return _Memx::validIndex (elm );}
  805. T1(TYPE) Int MemxAbstract<TYPE>:: absIndex (C TYPE *elm)C {return _Memx:: absIndex (elm );}
  806. T1(TYPE) Bool MemxAbstract<TYPE>:: contains (C TYPE *elm)C {return _Memx:: contains (elm );}
  807. T1(TYPE) MemxAbstract<TYPE>& MemxAbstract<TYPE>::removeAbs ( Int i , Bool keep_order) {_Memx::removeAbs (i , keep_order); return T;}
  808. T1(TYPE) MemxAbstract<TYPE>& MemxAbstract<TYPE>::removeValid( Int i , Bool keep_order) {_Memx::removeValid(i , keep_order); return T;}
  809. T1(TYPE) MemxAbstract<TYPE>& MemxAbstract<TYPE>::removeData (C TYPE *elm, Bool keep_order) {_Memx::removeData (elm, keep_order); return T;}
  810. T1(TYPE) MemxAbstract<TYPE>& MemxAbstract<TYPE>::removeLast ( ) {_Memx::removeLast ( ); return T;}
  811. T1(TYPE) T1(EXTENDED) MemxAbstract<TYPE>& MemxAbstract<TYPE>::replaceClass () {ASSERT_BASE_EXTENDED<TYPE, EXTENDED>(); _Memx::_reset(SIZE(EXTENDED), _abs.blockElms(), ClassFunc<EXTENDED>::GetNew(), ClassFunc<EXTENDED>::GetDel()); return T;}
  812. T1(TYPE) T1(BASE ) MemxAbstract<TYPE>::operator Memx<BASE>&() {ASSERT_BASE_EXTENDED<BASE, TYPE >(); return *( Memx<BASE>*)this;}
  813. T1(TYPE) T1(BASE ) MemxAbstract<TYPE>::operator C Memx<BASE>&()C {ASSERT_BASE_EXTENDED<BASE, TYPE >(); return *(C Memx<BASE>*)this;}
  814. T1(TYPE) MemxAbstract<TYPE>::MemxAbstract(Int block_elms) : _Memx(0, block_elms, null, null) {}
  815. /******************************************************************************/
  816. // MEML
  817. /******************************************************************************/
  818. T1(TYPE) Meml<TYPE>& Meml<TYPE>::del () {_Meml::del (); return T;}
  819. T1(TYPE) Meml<TYPE>& Meml<TYPE>::clear() {_Meml::clear(); return T;}
  820. T1(TYPE) Int Meml<TYPE>::elms ()C {return _Meml::elms ();}
  821. T1(TYPE) UInt Meml<TYPE>::elmSize ()C {return _Meml::elmSize ();}
  822. T1(TYPE) UInt Meml<TYPE>::memUsage()C {return _Meml::memUsage();}
  823. T1(TYPE) TYPE* Meml<TYPE>::addr (Int i ) {return (TYPE*)_Meml::addr (i);}
  824. T1(TYPE) TYPE& Meml<TYPE>::operator[](Int i ) {return *(TYPE*)_Meml::operator[](i);}
  825. T1(TYPE) TYPE& Meml<TYPE>::operator()(Int i ) {return *(TYPE*)_Meml::operator()(i);}
  826. T1(TYPE) TYPE& Meml<TYPE>::operator[](MemlNode *node) {return *(TYPE*) node->data ( );}
  827. T1(TYPE) TYPE& Meml<TYPE>::New ( ) {return *(TYPE*)_Meml::New ( );}
  828. T1(TYPE) TYPE& Meml<TYPE>::NewAt (Int i ) {return *(TYPE*)_Meml::NewAt (i);}
  829. T1(TYPE) C TYPE* Meml<TYPE>::addr (Int i )C {return ConstCast(T).addr(i );}
  830. T1(TYPE) C TYPE& Meml<TYPE>::operator[](Int i )C {return ConstCast(T) [i ];}
  831. T1(TYPE) C TYPE& Meml<TYPE>::operator[](MemlNode *node)C {return ConstCast(T) [node];}
  832. T1(TYPE) MemlNode* Meml<TYPE>::add ( ) {return _Meml::add ( );}
  833. T1(TYPE) MemlNode* Meml<TYPE>::addBefore(MemlNode *node) {return _Meml::addBefore(node);}
  834. T1(TYPE) MemlNode* Meml<TYPE>::addAfter (MemlNode *node) {return _Meml::addAfter (node);}
  835. T1(TYPE) MemlNode* Meml<TYPE>::first()C {return _Meml::first();}
  836. T1(TYPE) MemlNode* Meml<TYPE>::last ()C {return _Meml::last ();}
  837. T1(TYPE) Int Meml<TYPE>::index (C TYPE *elm)C {return _Meml::index (elm);}
  838. T1(TYPE) Bool Meml<TYPE>::contains(C TYPE *elm)C {return _Meml::contains(elm);}
  839. T1(TYPE) Meml<TYPE>& Meml<TYPE>::removeFirst( Bool keep_order) {_Meml::removeFirst( keep_order); return T;}
  840. T1(TYPE) Meml<TYPE>& Meml<TYPE>::removeLast ( ) {_Meml::removeLast ( ); return T;}
  841. T1(TYPE) Meml<TYPE>& Meml<TYPE>::remove (MemlNode *node, Bool keep_order) {_Meml::remove (node, keep_order); return T;}
  842. T1(TYPE) Meml<TYPE>& Meml<TYPE>::removeData (C TYPE *elm , Bool keep_order) {_Meml::removeData (elm , keep_order); return T;}
  843. T1(TYPE) Meml<TYPE>& Meml<TYPE>::removeIndex(Int i , Bool keep_order) {_Meml::removeIndex(i , keep_order); return T;}
  844. T1(TYPE) Meml<TYPE>& Meml<TYPE>::setNum (Int num) {_Meml::setNum (num); return T;}
  845. T1(TYPE) Meml<TYPE>& Meml<TYPE>::setNumZero(Int num) {_Meml::setNumZero(num); return T;}
  846. T1(TYPE) T1(VALUE) Bool Meml<TYPE>::binarySearch(C VALUE &value, Int &index, Int compare(C TYPE &a, C VALUE &b))C {return _BinarySearch(T, &value, index, (Int(*)(CPtr, CPtr))compare);}
  847. T1(TYPE) Meml<TYPE>& Meml<TYPE>::sort(Int compare(C TYPE &a, C TYPE &b)) {_Sort(T, (Int(*)(CPtr, CPtr))compare); return T;}
  848. T1(TYPE) Meml<TYPE>& Meml<TYPE>::reverseOrder( ) {_Meml::reverseOrder( ); return T;}
  849. T1(TYPE) Meml<TYPE>& Meml<TYPE>:: swapOrder(Int i, Int j) {_Meml:: swapOrder(i, j); return T;}
  850. T1(TYPE) Meml<TYPE>& Meml<TYPE>::operator=(C Mems<TYPE > &src) { setNum(src.elms()); FREPAO(T)=src[i]; return T;}
  851. T1(TYPE) Meml<TYPE>& Meml<TYPE>::operator=(C Memc<TYPE > &src) { setNum(src.elms()); FREPAO(T)=src[i]; return T;}
  852. T1(TYPE) template<Int size> Meml<TYPE>& Meml<TYPE>::operator=(C Memt<TYPE, size> &src) { setNum(src.elms()); FREPAO(T)=src[i]; return T;}
  853. T1(TYPE) Meml<TYPE>& Meml<TYPE>::operator=(C Memb<TYPE > &src) { setNum(src.elms()); FREPAO(T)=src[i]; return T;}
  854. T1(TYPE) Meml<TYPE>& Meml<TYPE>::operator=(C Memx<TYPE > &src) { setNum(src.elms()); FREPAO(T)=src[i]; return T;}
  855. T1(TYPE) Meml<TYPE>& Meml<TYPE>::operator=(C Meml<TYPE > &src) {if(this!=&src ){setNum(src.elms()); for(MemlNode *d=first(), *s=src.first(); d && s; d=d->next(), s=s->next())T[d]=src[s];} return T;}
  856. T1(TYPE) template<Int size> Meml<TYPE>& Meml<TYPE>::operator=(C MemPtr<TYPE, size> &src) {if(this!= src._meml){setNum(src.elms()); FREPAO(T)=src[i];} return T;}
  857. T1(TYPE) Meml<TYPE>& Meml<TYPE>::operator=( Meml <TYPE > &&src) {Swap(T, src); return T;}
  858. T1(TYPE) Bool Meml<TYPE>::save(File &f)C { f.cmpUIntV(elms()) ; MFREP(T)if(!T[i].save(f))return false; return f.ok();}
  859. T1(TYPE) Bool Meml<TYPE>::save(File &f) { f.cmpUIntV(elms()) ; MFREP(T)if(!T[i].save(f))return false; return f.ok();}
  860. T1(TYPE) Bool Meml<TYPE>::load(File &f) {setNum(f.decUIntV( )); MFREP(T)if(!T[i].load(f))goto error; if(f.ok())return true; error: clear(); return false;}
  861. T1(TYPE) Meml<TYPE>::Meml( ) : _Meml(SIZE(TYPE) , ClassFunc<TYPE>::GetNew(), ClassFunc<TYPE>::GetDel()) {}
  862. T1(TYPE) Meml<TYPE>::Meml(C Meml &src) : _Meml(src.elmSize(), src._new , src._del ) {T=src;}
  863. T1(TYPE) Meml<TYPE>::Meml( Meml &&src) : _Meml( 0, null , null ) {Swap(T, src);}
  864. /******************************************************************************/
  865. // MEMP
  866. /******************************************************************************/
  867. template<typename TYPE, Int Memt_size> MemPtr<TYPE, Memt_size>& MemPtr<TYPE, Memt_size>::point( null_t ) {_mode= PTR ; _ptr =null ; _elms= 0; return T;}
  868. template<typename TYPE, Int Memt_size> MemPtr<TYPE, Memt_size>& MemPtr<TYPE, Memt_size>::point( TYPE &src ) {_mode= PTR ; _ptr =&src ; _elms= 1; return T;}
  869. template<typename TYPE, Int Memt_size> MemPtr<TYPE, Memt_size>& MemPtr<TYPE, Memt_size>::point( TYPE *src, Int src_elms ) {_mode= PTR ; _ptr = src ; _elms= src_elms; return T;}
  870. template<typename TYPE, Int Memt_size> template<Int src_elms> MemPtr<TYPE, Memt_size>& MemPtr<TYPE, Memt_size>::point( TYPE (&src) [src_elms]) {_mode= PTR ; _ptr = src ; _elms= src_elms; return T;}
  871. template<typename TYPE, Int Memt_size> MemPtr<TYPE, Memt_size>& MemPtr<TYPE, Memt_size>::point(Mems <TYPE > &src ) {_mode= MEMS; _mems=&src ; _elms= 0; return T;}
  872. template<typename TYPE, Int Memt_size> MemPtr<TYPE, Memt_size>& MemPtr<TYPE, Memt_size>::point(Memc <TYPE > &src ) {_mode= MEMC; _memc=&src ; _elms= 0; return T;}
  873. template<typename TYPE, Int Memt_size> MemPtr<TYPE, Memt_size>& MemPtr<TYPE, Memt_size>::point(Memt <TYPE, Memt_size> &src ) {_mode= MEMT; _memt=&src ; _elms= 0; return T;}
  874. template<typename TYPE, Int Memt_size> MemPtr<TYPE, Memt_size>& MemPtr<TYPE, Memt_size>::point(Memb <TYPE > &src ) {_mode= MEMB; _memb=&src ; _elms= 0; return T;}
  875. template<typename TYPE, Int Memt_size> MemPtr<TYPE, Memt_size>& MemPtr<TYPE, Memt_size>::point(Memx <TYPE > &src ) {_mode= MEMX; _memx=&src ; _elms= 0; return T;}
  876. template<typename TYPE, Int Memt_size> MemPtr<TYPE, Memt_size>& MemPtr<TYPE, Memt_size>::point(Meml <TYPE > &src ) {_mode= MEML; _meml=&src ; _elms= 0; return T;}
  877. template<typename TYPE, Int Memt_size> MemPtr<TYPE, Memt_size>& MemPtr<TYPE, Memt_size>::point(MemPtr<TYPE, Memt_size> &src ) {_mode=src._mode; _ptr = src._ptr; _elms=src._elms; return T;}
  878. template<typename TYPE, Int Memt_size> MemPtr<TYPE, Memt_size>& MemPtr<TYPE, Memt_size>::clear()
  879. {
  880. switch(_mode)
  881. {
  882. case PTR : if(_elms)Exit("'MemPtr.clear' does not support PTR mode"); break;
  883. case MEMS: _mems->clear(); break;
  884. case MEMC: _memc->clear(); break;
  885. case MEMT: _memt->clear(); break;
  886. case MEMB: _memb->clear(); break;
  887. case MEMX: _memx->clear(); break;
  888. case MEML: _meml->clear(); break;
  889. }
  890. return T;
  891. }
  892. template<typename TYPE, Int Memt_size> MemPtr<TYPE, Memt_size>& MemPtr<TYPE, Memt_size>::del()
  893. {
  894. switch(_mode)
  895. {
  896. case PTR : if(_elms)Exit("'MemPtr.del' does not support PTR mode"); break;
  897. case MEMS: _mems->del(); break;
  898. case MEMC: _memc->del(); break;
  899. case MEMT: _memt->del(); break;
  900. case MEMB: _memb->del(); break;
  901. case MEMX: _memx->del(); break;
  902. case MEML: _meml->del(); break;
  903. }
  904. return T;
  905. }
  906. template<typename TYPE, Int Memt_size> Int MemPtr<TYPE, Memt_size>::elms()C
  907. {
  908. switch(_mode)
  909. {
  910. default : return _elms; // PTR
  911. case MEMS: return _mems->elms();
  912. case MEMC: return _memc->elms();
  913. case MEMT: return _memt->elms();
  914. case MEMB: return _memb->elms();
  915. case MEMX: return _memx->elms();
  916. case MEML: return _meml->elms();
  917. }
  918. }
  919. template<typename TYPE, Int Memt_size> UInt MemPtr<TYPE, Memt_size>::elmSize()C
  920. {
  921. switch(_mode)
  922. {
  923. default : return SIZE(TYPE); // PTR
  924. case MEMS: return _mems->elmSize();
  925. case MEMC: return _memc->elmSize();
  926. case MEMT: return _memt->elmSize();
  927. case MEMB: return _memb->elmSize();
  928. case MEMX: return _memx->elmSize();
  929. case MEML: return _meml->elmSize();
  930. }
  931. }
  932. template<typename TYPE, Int Memt_size> UInt MemPtr<TYPE, Memt_size>::memUsage()C
  933. {
  934. switch(_mode)
  935. {
  936. default : return elms()*elmSize(); // PTR
  937. case MEMS: return _mems->memUsage();
  938. case MEMC: return _memc->memUsage();
  939. case MEMT: return _memt->memUsage();
  940. case MEMB: return _memb->memUsage();
  941. case MEMX: return _memx->memUsage();
  942. case MEML: return _meml->memUsage();
  943. }
  944. }
  945. template<typename TYPE, Int Memt_size> TYPE* MemPtr<TYPE, Memt_size>::data()
  946. {
  947. switch(_mode)
  948. {
  949. default : return _ptr; // PTR
  950. case MEMS: return _mems->data();
  951. case MEMC: return _memc->data();
  952. case MEMT: return _memt->data();
  953. case MEMB: Exit("'MemPtr.data' does not support MEMB mode"); return null;
  954. case MEMX: Exit("'MemPtr.data' does not support MEMX mode"); return null;
  955. case MEML: Exit("'MemPtr.data' does not support MEML mode"); return null;
  956. }
  957. }
  958. template<typename TYPE, Int Memt_size> TYPE* MemPtr<TYPE, Memt_size>::addr(Int i)
  959. {
  960. switch(_mode)
  961. {
  962. default : return InRange(i, _elms) ? &_ptr[i] : null; // PTR
  963. case MEMS: return _mems->addr(i);
  964. case MEMC: return _memc->addr(i);
  965. case MEMT: return _memt->addr(i);
  966. case MEMB: return _memb->addr(i);
  967. case MEMX: return _memx->addr(i);
  968. case MEML: return _meml->addr(i);
  969. }
  970. }
  971. template<typename TYPE, Int Memt_size> TYPE& MemPtr<TYPE, Memt_size>::operator[](Int i)
  972. {
  973. switch(_mode)
  974. {
  975. default : RANGE_ASSERT(i, _elms); return _ptr[i]; // PTR
  976. case MEMS: return (*_mems)[i];
  977. case MEMC: return (*_memc)[i];
  978. case MEMT: return (*_memt)[i];
  979. case MEMB: return (*_memb)[i];
  980. case MEMX: return (*_memx)[i];
  981. case MEML: return (*_meml)[i];
  982. }
  983. }
  984. template<typename TYPE, Int Memt_size> TYPE& MemPtr<TYPE, Memt_size>::operator()(Int i)
  985. {
  986. switch(_mode)
  987. {
  988. default : if(!InRange(i, _elms))Exit("'MemPtr.operator(Int)' PTR mode out of range"); return _ptr[i]; // PTR
  989. case MEMS: return (*_mems)(i);
  990. case MEMC: return (*_memc)(i);
  991. case MEMT: return (*_memt)(i);
  992. case MEMB: return (*_memb)(i);
  993. case MEMX: Exit("'MemPtr.operator(Int)' does not support MEMX mode"); return *(TYPE*)null;
  994. case MEML: return (*_meml)(i);
  995. }
  996. }
  997. template<typename TYPE, Int Memt_size> TYPE& MemPtr<TYPE, Memt_size>::first() {return T[0 ];}
  998. template<typename TYPE, Int Memt_size> TYPE& MemPtr<TYPE, Memt_size>::last () {return T[elms()-1];}
  999. template<typename TYPE, Int Memt_size> C TYPE* MemPtr<TYPE, Memt_size>::data ( )C {return ConstCast(T).data ( );}
  1000. template<typename TYPE, Int Memt_size> C TYPE* MemPtr<TYPE, Memt_size>::addr (Int i)C {return ConstCast(T).addr (i);}
  1001. template<typename TYPE, Int Memt_size> C TYPE& MemPtr<TYPE, Memt_size>::operator[](Int i)C {return ConstCast(T) [i];}
  1002. template<typename TYPE, Int Memt_size> C TYPE& MemPtr<TYPE, Memt_size>::first ( )C {return ConstCast(T).first( );}
  1003. template<typename TYPE, Int Memt_size> C TYPE& MemPtr<TYPE, Memt_size>::last ( )C {return ConstCast(T).last ( );}
  1004. template<typename TYPE, Int Memt_size> TYPE& MemPtr<TYPE, Memt_size>::New()
  1005. {
  1006. switch(_mode)
  1007. {
  1008. default : Exit("'MemPtr.New' does not support PTR mode"); return *(TYPE*)null; // PTR
  1009. case MEMS: return _mems->New();
  1010. case MEMC: return _memc->New();
  1011. case MEMT: return _memt->New();
  1012. case MEMB: return _memb->New();
  1013. case MEMX: return _memx->New();
  1014. case MEML: return _meml->New();
  1015. }
  1016. }
  1017. template<typename TYPE, Int Memt_size> TYPE& MemPtr<TYPE, Memt_size>::NewAt(Int i)
  1018. {
  1019. switch(_mode)
  1020. {
  1021. default : Exit("'MemPtr.NewAt' does not support PTR mode"); return *(TYPE*)null; // PTR
  1022. case MEMS: return _mems->NewAt(i);
  1023. case MEMC: return _memc->NewAt(i);
  1024. case MEMT: return _memt->NewAt(i);
  1025. case MEMB: return _memb->NewAt(i);
  1026. case MEMX: return _memx->NewAt(i);
  1027. case MEML: return _meml->NewAt(i);
  1028. }
  1029. }
  1030. template<typename TYPE, Int Memt_size> Int MemPtr<TYPE, Memt_size>::index(C TYPE *elm)C
  1031. {
  1032. switch(_mode)
  1033. {
  1034. case PTR : {Int i=elm-_ptr; if(InRange(i, _elms))return i;} break;
  1035. case MEMS: return _mems->index(elm);
  1036. case MEMC: return _memc->index(elm);
  1037. case MEMT: return _memt->index(elm);
  1038. case MEMB: return _memb->index(elm);
  1039. case MEMX: return _memx->validIndex(elm);
  1040. case MEML: return _meml->index(elm);
  1041. }
  1042. return -1;
  1043. }
  1044. template<typename TYPE, Int Memt_size> Bool MemPtr<TYPE, Memt_size>::contains(C TYPE *elm)C {return index(elm)>=0;}
  1045. template<typename TYPE, Int Memt_size> MemPtr<TYPE, Memt_size>& MemPtr<TYPE, Memt_size>::removeLast()
  1046. {
  1047. switch(_mode)
  1048. {
  1049. case PTR : if(_elms)Exit("'MemPtr.removeLast' does not support PTR mode"); break;
  1050. case MEMS: _mems->removeLast(); break;
  1051. case MEMC: _memc->removeLast(); break;
  1052. case MEMT: _memt->removeLast(); break;
  1053. case MEMB: _memb->removeLast(); break;
  1054. case MEMX: _memx->removeLast(); break;
  1055. case MEML: _meml->removeLast(); break;
  1056. }
  1057. return T;
  1058. }
  1059. template<typename TYPE, Int Memt_size> MemPtr<TYPE, Memt_size>& MemPtr<TYPE, Memt_size>::remove(Int i, Bool keep_order)
  1060. {
  1061. switch(_mode)
  1062. {
  1063. case PTR : if(InRange(i, _elms))Exit("'MemPtr.remove' does not support PTR mode"); break;
  1064. case MEMS: _mems->remove (i, keep_order); break;
  1065. case MEMC: _memc->remove (i, keep_order); break;
  1066. case MEMT: _memt->remove (i, keep_order); break;
  1067. case MEMB: _memb->remove (i, keep_order); break;
  1068. case MEMX: _memx->removeValid(i, keep_order); break;
  1069. case MEML: _meml->removeIndex(i, keep_order); break;
  1070. }
  1071. return T;
  1072. }
  1073. template<typename TYPE, Int Memt_size> MemPtr<TYPE, Memt_size>& MemPtr<TYPE, Memt_size>::removeData(C TYPE *elm, Bool keep_order)
  1074. {
  1075. switch(_mode)
  1076. {
  1077. case PTR : if(InRange(index(elm), _elms))Exit("'MemPtr.removeData' does not support PTR mode"); break;
  1078. case MEMS: _mems->removeData(elm, keep_order); break;
  1079. case MEMC: _memc->removeData(elm, keep_order); break;
  1080. case MEMT: _memt->removeData(elm, keep_order); break;
  1081. case MEMB: _memb->removeData(elm, keep_order); break;
  1082. case MEMX: _memx->removeData(elm, keep_order); break;
  1083. case MEML: _meml->removeData(elm, keep_order); break;
  1084. }
  1085. return T;
  1086. }
  1087. template<typename TYPE, Int Memt_size> MemPtr<TYPE, Memt_size>& MemPtr<TYPE, Memt_size>::setNum(Int num)
  1088. {
  1089. switch(_mode)
  1090. {
  1091. case PTR : if(_elms!=num)Exit("'MemPtr.setNum' does not support PTR mode"); break;
  1092. case MEMS: _mems->setNum(num); break;
  1093. case MEMC: _memc->setNum(num); break;
  1094. case MEMT: _memt->setNum(num); break;
  1095. case MEMB: _memb->setNum(num); break;
  1096. case MEMX: _memx->setNum(num); break;
  1097. case MEML: _meml->setNum(num); break;
  1098. }
  1099. return T;
  1100. }
  1101. template<typename TYPE, Int Memt_size> MemPtr<TYPE, Memt_size>& MemPtr<TYPE, Memt_size>::setNumZero(Int num)
  1102. {
  1103. switch(_mode)
  1104. {
  1105. case PTR : if(_elms!=num)Exit("'MemPtr.setNumZero' does not support PTR mode"); break;
  1106. case MEMS: _mems->setNumZero(num); break;
  1107. case MEMC: _memc->setNumZero(num); break;
  1108. case MEMT: _memt->setNumZero(num); break;
  1109. case MEMB: _memb->setNumZero(num); break;
  1110. case MEMX: Exit("'MemPtr.setNumZero' does not support MEMX mode"); break;
  1111. case MEML: _meml->setNumZero(num); break;
  1112. }
  1113. return T;
  1114. }
  1115. template<typename TYPE, Int Memt_size> Int MemPtr<TYPE, Memt_size>::addNum(Int num)
  1116. {
  1117. switch(_mode)
  1118. {
  1119. default : if(num)Exit("'MemPtr.addNum' does not support PTR mode"); return _elms; // PTR
  1120. case MEMS: return _mems->addNum(num);
  1121. case MEMC: return _memc->addNum(num);
  1122. case MEMT: return _memt->addNum(num);
  1123. case MEMB: return _memb->addNum(num);
  1124. case MEMX: return _memx->addNum(num);
  1125. case MEML: return _meml->addNum(num);
  1126. }
  1127. }
  1128. template<typename TYPE, Int Memt_size> T1(VALUE) Bool MemPtr<TYPE, Memt_size>::binarySearch(C VALUE &value, Int &index, Int compare(C TYPE &a, C VALUE &b))C
  1129. {
  1130. switch(_mode)
  1131. {
  1132. default : return BinarySearch(_ptr, _elms, value, index, compare); // PTR
  1133. case MEMS: return _mems->binarySearch( value, index, compare);
  1134. case MEMC: return _memc->binarySearch( value, index, compare);
  1135. case MEMT: return _memt->binarySearch( value, index, compare);
  1136. case MEMB: return _memb->binarySearch( value, index, compare);
  1137. case MEMX: return _memx->binarySearch( value, index, compare);
  1138. case MEML: return _meml->binarySearch( value, index, compare);
  1139. }
  1140. }
  1141. template<typename TYPE, Int Memt_size> MemPtr<TYPE, Memt_size>& MemPtr<TYPE, Memt_size>::sort(Int compare(C TYPE &a, C TYPE &b))
  1142. {
  1143. switch(_mode)
  1144. {
  1145. case PTR : Sort(_ptr, _elms, compare); break;
  1146. case MEMS: _mems->sort( compare); break;
  1147. case MEMC: _memc->sort( compare); break;
  1148. case MEMT: _memt->sort( compare); break;
  1149. case MEMB: _memb->sort( compare); break;
  1150. case MEMX: _memx->sort( compare); break;
  1151. case MEML: _meml->sort( compare); break;
  1152. }
  1153. return T;
  1154. }
  1155. template<typename TYPE, Int Memt_size> MemPtr<TYPE, Memt_size>& MemPtr<TYPE, Memt_size>::reverseOrder()
  1156. {
  1157. switch(_mode)
  1158. {
  1159. case PTR : ReverseOrder(_ptr, _elms); break;
  1160. case MEMS: _mems->reverseOrder( ); break;
  1161. case MEMC: _memc->reverseOrder( ); break;
  1162. case MEMT: _memt->reverseOrder( ); break;
  1163. case MEMB: _memb->reverseOrder( ); break;
  1164. case MEMX: _memx->reverseOrder( ); break;
  1165. case MEML: _meml->reverseOrder( ); break;
  1166. }
  1167. return T;
  1168. }
  1169. template<typename TYPE, Int Memt_size> MemPtr<TYPE, Memt_size>& MemPtr<TYPE, Memt_size>::swapOrder(Int i, Int j)
  1170. {
  1171. switch(_mode)
  1172. {
  1173. case PTR : if(InRange(i, _elms) && InRange(j, _elms))Swap(&T[i], &T[j], elmSize()); break;
  1174. case MEMS: _mems->swapOrder(i, j); break;
  1175. case MEMC: _memc->swapOrder(i, j); break;
  1176. case MEMT: _memt->swapOrder(i, j); break;
  1177. case MEMB: _memb->swapOrder(i, j); break;
  1178. case MEMX: _memx->swapOrder(i, j); break;
  1179. case MEML: _meml->swapOrder(i, j); break;
  1180. }
  1181. return T;
  1182. }
  1183. template<typename TYPE, Int Memt_size> MemPtr<TYPE, Memt_size>& MemPtr<TYPE, Memt_size>::operator=(C TYPE &src ) { setNum( 1); T[0]=src ; return T;}
  1184. template<typename TYPE, Int Memt_size> template<Int src_elms> MemPtr<TYPE, Memt_size>& MemPtr<TYPE, Memt_size>::operator=(C TYPE (&src)[src_elms]) { setNum(src_elms ); FREPAO(T)=src[i]; return T;}
  1185. template<typename TYPE, Int Memt_size> MemPtr<TYPE, Memt_size>& MemPtr<TYPE, Memt_size>::operator=(C Mems <TYPE > &src ) {if(_mems!= &src ){setNum(src.elms()); FREPAO(T)=src[i];} return T;}
  1186. template<typename TYPE, Int Memt_size> MemPtr<TYPE, Memt_size>& MemPtr<TYPE, Memt_size>::operator=(C Memc <TYPE > &src ) {if(_memc!= &src ){setNum(src.elms()); FREPAO(T)=src[i];} return T;}
  1187. template<typename TYPE, Int Memt_size> template<Int src_size> MemPtr<TYPE, Memt_size>& MemPtr<TYPE, Memt_size>::operator=(C Memt <TYPE, src_size> &src ) {if(_memt!=Ptr(&src)){setNum(src.elms()); FREPAO(T)=src[i];} return T;}
  1188. template<typename TYPE, Int Memt_size> MemPtr<TYPE, Memt_size>& MemPtr<TYPE, Memt_size>::operator=(C Memb <TYPE > &src ) {if(_memb!= &src ){setNum(src.elms()); FREPAO(T)=src[i];} return T;}
  1189. template<typename TYPE, Int Memt_size> MemPtr<TYPE, Memt_size>& MemPtr<TYPE, Memt_size>::operator=(C Memx <TYPE > &src ) {if(_memx!= &src ){setNum(src.elms()); FREPAO(T)=src[i];} return T;}
  1190. template<typename TYPE, Int Memt_size> MemPtr<TYPE, Memt_size>& MemPtr<TYPE, Memt_size>::operator=(C Meml <TYPE > &src ) {if(_meml!= &src ){setNum(src.elms()); FREPAO(T)=src[i];} return T;}
  1191. template<typename TYPE, Int Memt_size> MemPtr<TYPE, Memt_size>& MemPtr<TYPE, Memt_size>::operator=(C MemPtr<TYPE, Memt_size> &src ) { setNum(src.elms()); FREPAO(T)=src[i]; return T;}
  1192. template<typename TYPE, Int Memt_size> template<Int src_size> MemPtr<TYPE, Memt_size>& MemPtr<TYPE, Memt_size>::operator=(C MemPtr<TYPE, src_size> &src ) { setNum(src.elms()); FREPAO(T)=src[i]; return T;}
  1193. template<typename TYPE, Int Memt_elms> MemPtrN<TYPE, Memt_elms>& MemPtrN<TYPE, Memt_elms>::operator=(C TYPE &src ) {MemPtr<TYPE, SIZE(TYPE)*Memt_elms>::operator=(src); return T;}
  1194. template<typename TYPE, Int Memt_elms> template<Int src_elms> MemPtrN<TYPE, Memt_elms>& MemPtrN<TYPE, Memt_elms>::operator=(C TYPE (&src)[src_elms]) {MemPtr<TYPE, SIZE(TYPE)*Memt_elms>::operator=(src); return T;}
  1195. template<typename TYPE, Int Memt_elms> MemPtrN<TYPE, Memt_elms>& MemPtrN<TYPE, Memt_elms>::operator=(C Mems <TYPE > &src ) {MemPtr<TYPE, SIZE(TYPE)*Memt_elms>::operator=(src); return T;}
  1196. template<typename TYPE, Int Memt_elms> MemPtrN<TYPE, Memt_elms>& MemPtrN<TYPE, Memt_elms>::operator=(C Memc <TYPE > &src ) {MemPtr<TYPE, SIZE(TYPE)*Memt_elms>::operator=(src); return T;}
  1197. template<typename TYPE, Int Memt_elms> template<Int src_size> MemPtrN<TYPE, Memt_elms>& MemPtrN<TYPE, Memt_elms>::operator=(C Memt <TYPE, src_size> &src ) {MemPtr<TYPE, SIZE(TYPE)*Memt_elms>::operator=(src); return T;}
  1198. template<typename TYPE, Int Memt_elms> MemPtrN<TYPE, Memt_elms>& MemPtrN<TYPE, Memt_elms>::operator=(C Memb <TYPE > &src ) {MemPtr<TYPE, SIZE(TYPE)*Memt_elms>::operator=(src); return T;}
  1199. template<typename TYPE, Int Memt_elms> MemPtrN<TYPE, Memt_elms>& MemPtrN<TYPE, Memt_elms>::operator=(C Memx <TYPE > &src ) {MemPtr<TYPE, SIZE(TYPE)*Memt_elms>::operator=(src); return T;}
  1200. template<typename TYPE, Int Memt_elms> MemPtrN<TYPE, Memt_elms>& MemPtrN<TYPE, Memt_elms>::operator=(C Meml <TYPE > &src ) {MemPtr<TYPE, SIZE(TYPE)*Memt_elms>::operator=(src); return T;}
  1201. template<typename TYPE, Int Memt_elms> template<Int src_size> MemPtrN<TYPE, Memt_elms>& MemPtrN<TYPE, Memt_elms>::operator=(C MemPtr <TYPE, src_size> &src ) {MemPtr<TYPE, SIZE(TYPE)*Memt_elms>::operator=(src); return T;}
  1202. template<typename TYPE, Int Memt_elms> MemPtrN<TYPE, Memt_elms>& MemPtrN<TYPE, Memt_elms>::operator=(C MemPtrN<TYPE, Memt_elms> &src ) {MemPtr<TYPE, SIZE(TYPE)*Memt_elms>::operator=(src); return T;}
  1203. #if EE_PRIVATE
  1204. template<typename TYPE, Int Memt_size> void MemPtr<TYPE, Memt_size>::copyTo(TYPE *dest)C
  1205. {
  1206. switch(_mode)
  1207. {
  1208. case PTR : CopyN(dest, _ptr, _elms); break;
  1209. case MEMS: _mems->copyTo(dest); break;
  1210. case MEMC: _memc->copyTo(dest); break;
  1211. case MEMT: _memt->copyTo(dest); break;
  1212. case MEMB: _memb->copyTo(dest); break;
  1213. case MEMX: _memx->copyTo(dest); break;
  1214. case MEML: _meml->copyTo(dest); break;
  1215. }
  1216. }
  1217. template<typename TYPE, Int Memt_size> MemPtr<TYPE, Memt_size>& MemPtr<TYPE, Memt_size>::copyFrom(C TYPE *src)
  1218. {
  1219. switch(_mode)
  1220. {
  1221. case PTR : CopyN(_ptr, src, _elms); break;
  1222. case MEMS: _mems->copyFrom(src); break;
  1223. case MEMC: _memc->copyFrom(src); break;
  1224. case MEMT: _memt->copyFrom(src); break;
  1225. case MEMB: _memb->copyFrom(src); break;
  1226. case MEMX: _memx->copyFrom(src); break;
  1227. case MEML: _meml->copyFrom(src); break;
  1228. }
  1229. return T;
  1230. }
  1231. #endif
  1232. template<typename TYPE, Int Memt_size> MemPtr<TYPE, Memt_size>::operator Bool()C {return _mode!=PTR || elms();}
  1233. template<typename TYPE, Int Memt_size> Bool MemPtr<TYPE, Memt_size>::resizable ()C {return _mode!=PTR;}
  1234. template<typename TYPE, Int Memt_size> Bool MemPtr<TYPE, Memt_size>::continuous ()C {return _mode==PTR || _mode==MEMS || _mode==MEMC || _mode==MEMT;}
  1235. template<typename TYPE, Int Memt_size> Bool MemPtr<TYPE, Memt_size>::save(File &f)C
  1236. {
  1237. switch(_mode)
  1238. {
  1239. default : f.cmpUIntV(elms()); FREPA(T)if(!T[i].save(f))return false; return f.ok(); // PTR
  1240. case MEMS: return _mems->save(f);
  1241. case MEMC: return _memc->save(f);
  1242. case MEMT: return _memt->save(f);
  1243. case MEMB: return _memb->save(f);
  1244. case MEMX: return _memx->save(f);
  1245. case MEML: return _meml->save(f);
  1246. }
  1247. }
  1248. template<typename TYPE, Int Memt_size> Bool MemPtr<TYPE, Memt_size>::save(File &f)
  1249. {
  1250. switch(_mode)
  1251. {
  1252. default : f.cmpUIntV(elms()); FREPA(T)if(!T[i].save(f))return false; return f.ok(); // PTR
  1253. case MEMS: return _mems->save(f);
  1254. case MEMC: return _memc->save(f);
  1255. case MEMT: return _memt->save(f);
  1256. case MEMB: return _memb->save(f);
  1257. case MEMX: return _memx->save(f);
  1258. case MEML: return _meml->save(f);
  1259. }
  1260. }
  1261. template<typename TYPE, Int Memt_size> Bool MemPtr<TYPE, Memt_size>::load(File &f)
  1262. {
  1263. switch(_mode)
  1264. {
  1265. default : if(f.decUIntV()!=elms())return false; FREPA(T)if(!T[i].load(f))return false; return f.ok(); // PTR
  1266. case MEMS: return _mems->load(f);
  1267. case MEMC: return _memc->load(f);
  1268. case MEMT: return _memt->load(f);
  1269. case MEMB: return _memb->load(f);
  1270. case MEMX: return _memx->load(f);
  1271. case MEML: return _meml->load(f);
  1272. }
  1273. }
  1274. template<typename TYPE, Int Memt_size> Bool MemPtr<TYPE, Memt_size>::saveRaw(File &f)C
  1275. {
  1276. switch(_mode)
  1277. {
  1278. default : f.cmpUIntV(elms()); f.putN(_ptr, elms()); return f.ok(); // PTR
  1279. case MEMS: return _mems->saveRaw(f);
  1280. case MEMC: return _memc->saveRaw(f);
  1281. case MEMT: return _memt->saveRaw(f);
  1282. case MEMB: return _memb->saveRaw(f);
  1283. case MEMX: return _memx->saveRaw(f);
  1284. case MEML: return _meml->saveRaw(f);
  1285. }
  1286. }
  1287. template<typename TYPE, Int Memt_size> Bool MemPtr<TYPE, Memt_size>::loadRaw(File &f)
  1288. {
  1289. switch(_mode)
  1290. {
  1291. default : if(f.decUIntV()!=elms())return false; f.getN(_ptr, elms()); return f.ok(); // PTR
  1292. case MEMS: return _mems->loadRaw(f);
  1293. case MEMC: return _memc->loadRaw(f);
  1294. case MEMT: return _memt->loadRaw(f);
  1295. case MEMB: return _memb->loadRaw(f);
  1296. case MEMX: return _memx->loadRaw(f);
  1297. case MEML: return _meml->loadRaw(f);
  1298. }
  1299. }
  1300. /******************************************************************************/
  1301. // COUNTED POINTER
  1302. /******************************************************************************/
  1303. T1(TYPE) void CountedPtr<TYPE>::DecRef(TYPE *data) {ASSERT_BASE_EXTENDED<PtrCounter, TYPE>(); SCAST(PtrCounter, *data).decRef(ClassFunc<TYPE>::Unload );}
  1304. T1(TYPE) void CountedPtr<TYPE>::IncRef(TYPE *data) {ASSERT_BASE_EXTENDED<PtrCounter, TYPE>(); SCAST(PtrCounter, *data).incRef(ClassFunc<TYPE>::LoadEmpty);}
  1305. T1(TYPE) CountedPtr<TYPE>& CountedPtr<TYPE>::clear ( ) { DecRef(T._data); T._data= null ; return T;}
  1306. T1(TYPE) CountedPtr<TYPE>& CountedPtr<TYPE>::operator=( TYPE * data) {if(T!=data){DecRef(T._data); IncRef(T._data= data);} return T;}
  1307. T1(TYPE) CountedPtr<TYPE>& CountedPtr<TYPE>::operator=(C CountedPtr & eptr) {if(T!=eptr){DecRef(T._data); IncRef(T._data=eptr._data);} return T;}
  1308. T1(TYPE) CountedPtr<TYPE>& CountedPtr<TYPE>::operator=( CountedPtr &&eptr) {Swap(_data, eptr._data); return T;}
  1309. T1(TYPE) CountedPtr<TYPE>& CountedPtr<TYPE>::operator=( null_t ) {clear(); return T;}
  1310. T1(TYPE) CountedPtr<TYPE>:: CountedPtr( null_t ) { T._data= null ;}
  1311. T1(TYPE) CountedPtr<TYPE>:: CountedPtr( TYPE * data) {IncRef(T._data= data);}
  1312. T1(TYPE) CountedPtr<TYPE>:: CountedPtr(C CountedPtr & eptr) {IncRef(T._data=eptr._data);}
  1313. T1(TYPE) CountedPtr<TYPE>:: CountedPtr( CountedPtr &&eptr) { T._data=eptr._data ; eptr._data=null;}
  1314. T1(TYPE) CountedPtr<TYPE>::~CountedPtr( ) {clear();}
  1315. /******************************************************************************/
  1316. // CACHE
  1317. /******************************************************************************/
  1318. T1(TYPE) Cache<TYPE>& Cache<TYPE>::clear ( ) { _Cache::clear ( ); return T;}
  1319. T1(TYPE) Cache<TYPE>& Cache<TYPE>::del ( ) { _Cache::del ( ); return T;}
  1320. T1(TYPE) CACHE_MODE Cache<TYPE>::mode (CACHE_MODE mode) {return (CACHE_MODE)_Cache::mode (mode ); }
  1321. T1(TYPE) Cache<TYPE>& Cache<TYPE>::caseSensitive (Bool sensitive) { _Cache::caseSensitive (sensitive); return T;}
  1322. T1(TYPE) Cache<TYPE>& Cache<TYPE>::delayRemove (Flt time ) { _Cache::delayRemove (time ); return T;}
  1323. T1(TYPE) Cache<TYPE>& Cache<TYPE>::delayRemoveNow( ) { _Cache::delayRemoveNow( ); return T;}
  1324. T1(TYPE) Cache<TYPE>& Cache<TYPE>::delayRemoveInc( ) { _Cache::delayRemoveInc( ); return T;}
  1325. T1(TYPE) Cache<TYPE>& Cache<TYPE>::delayRemoveDec( ) { _Cache::delayRemoveDec( ); return T;}
  1326. T1(TYPE) TYPE* Cache<TYPE>::find (C Str &file, CChar *path) {return (TYPE*)_Cache::_find (file, path, false);}
  1327. T1(TYPE) TYPE* Cache<TYPE>::find (C UID &id , CChar *path) {return (TYPE*)_Cache::_find (id , path, false);}
  1328. T1(TYPE) TYPE* Cache<TYPE>::get (C Str &file, CChar *path) {return (TYPE*)_Cache::_get (file, path, false);}
  1329. T1(TYPE) TYPE* Cache<TYPE>::get (C UID &id , CChar *path) {return (TYPE*)_Cache::_get (id , path, false);}
  1330. T1(TYPE) TYPE* Cache<TYPE>::operator()(C Str &file, CChar *path) {return (TYPE*)_Cache::_require(file, path, false);}
  1331. T1(TYPE) TYPE* Cache<TYPE>::operator()(C UID &id , CChar *path) {return (TYPE*)_Cache::_require(id , path, false);}
  1332. T1(TYPE) CChar* Cache<TYPE>::name (C TYPE *data, CChar *path)C {return _Cache::_name (data, path);}
  1333. T1(TYPE) UID Cache<TYPE>::id (C TYPE *data )C {return _Cache::_id (data );}
  1334. T1(TYPE) Bool Cache<TYPE>::contains(C TYPE *data )C {return _Cache::_contains(data );}
  1335. T1(TYPE) Bool Cache<TYPE>::dummy (C TYPE *data )C {return _Cache::_dummy (data );}
  1336. T1(TYPE) void Cache<TYPE>::dummy (C TYPE *data, Bool dummy) { _Cache::_dummy (data, dummy);}
  1337. T1(TYPE) Int Cache<TYPE>:: elms ( )C {return _Cache:: elms ( );}
  1338. T1(TYPE) void Cache<TYPE>:: lock ( )C { _Cache:: lock ( );}
  1339. T1(TYPE) C _Cache::Desc& Cache<TYPE>:: lockedDesc(Int i)C {return _Cache:: lockedDesc(i);}
  1340. T1(TYPE) TYPE & Cache<TYPE>:: lockedData(Int i) {return *(TYPE*)_Cache:: lockedData(i);}
  1341. T1(TYPE) C TYPE & Cache<TYPE>:: lockedData(Int i)C {return *(TYPE*)_Cache:: lockedData(i);}
  1342. T1(TYPE) void Cache<TYPE>::unlock ( )C { _Cache::unlock ( );}
  1343. T1(TYPE) void Cache<TYPE>::removeData(C TYPE *data) {return _Cache::_removeData(data);}
  1344. T1(TYPE) void Cache<TYPE>::update() {return _Cache::update();}
  1345. T1(TYPE) void Cache<TYPE>::setLoadUser(Ptr user) {_Cache::setLoadUser(ClassFunc<TYPE>::LoadUser, user);}
  1346. T1(TYPE) T1(EXTENDED) Cache<TYPE>& Cache<TYPE>::replaceClass() {ASSERT_BASE_EXTENDED<TYPE, EXTENDED>(); lock(); del(); /*_data_offset=OFFSET(typename Cache<EXTENDED>::Elm, data);*/ _desc_offset=OFFSET(typename Cache<EXTENDED>::Elm, desc); _memx.replaceClass<typename Cache<EXTENDED>::Elm>(); unlock(); return T;}
  1347. T1(TYPE) Cache<TYPE>& Cache<TYPE>::operator=(C Cache<TYPE> &src) {if(this!=&src){lock(); src.lock(); _lockedFrom(src); FREPA(T)lockedData(i)=src.lockedData(i); src.unlock(); unlock();} return T;}
  1348. T1(TYPE) Cache<TYPE>::Cache(CChar8 *name, Int block_elms) : _Cache(name, block_elms, ClassFunc<TYPE>::Load) {replaceClass<TYPE>();}
  1349. inline Int Elms(C _Cache &cache) {return cache.elms();}
  1350. T1(TYPE) inline Int Elms(C Cache<TYPE> &cache) {return cache.elms();}
  1351. /******************************************************************************/
  1352. // CACHE ELEMENT POINTER
  1353. /******************************************************************************/
  1354. template<typename TYPE, Cache<TYPE> &CACHE> CChar* CacheElmPtr<TYPE,CACHE>::name (CChar *path )C {return CACHE._name (_data, path );}
  1355. template<typename TYPE, Cache<TYPE> &CACHE> UID CacheElmPtr<TYPE,CACHE>::id ( )C {return CACHE._id (_data );}
  1356. template<typename TYPE, Cache<TYPE> &CACHE> Bool CacheElmPtr<TYPE,CACHE>::dummy( )C {return CACHE._dummy(_data );}
  1357. template<typename TYPE, Cache<TYPE> &CACHE> void CacheElmPtr<TYPE,CACHE>::dummy(Bool dummy) { CACHE._dummy(_data, dummy);}
  1358. template<typename TYPE, Cache<TYPE> &CACHE> CacheElmPtr<TYPE,CACHE>& CacheElmPtr<TYPE,CACHE>::clear ( ) { CACHE._decRef(T._data); T._data= null ; return T;}
  1359. template<typename TYPE, Cache<TYPE> &CACHE> CacheElmPtr<TYPE,CACHE>& CacheElmPtr<TYPE,CACHE>::operator=( TYPE * data) {if(T!=data){CACHE._decRef(T._data); CACHE._incRef(T._data= data);} return T;}
  1360. template<typename TYPE, Cache<TYPE> &CACHE> CacheElmPtr<TYPE,CACHE>& CacheElmPtr<TYPE,CACHE>::operator=(C CacheElmPtr & eptr) {if(T!=eptr){CACHE._decRef(T._data); CACHE._incRef(T._data=eptr._data);} return T;}
  1361. template<typename TYPE, Cache<TYPE> &CACHE> CacheElmPtr<TYPE,CACHE>& CacheElmPtr<TYPE,CACHE>::operator=( CacheElmPtr &&eptr) {Swap(_data, eptr._data); return T;}
  1362. template<typename TYPE, Cache<TYPE> &CACHE> CacheElmPtr<TYPE,CACHE>& CacheElmPtr<TYPE,CACHE>::operator=( null_t ) {clear(); return T;}
  1363. template<typename TYPE, Cache<TYPE> &CACHE> CacheElmPtr<TYPE,CACHE>& CacheElmPtr<TYPE,CACHE>::find (CChar *file, CChar *path) {TYPE *old=T._data; T._data=(TYPE*)CACHE._find ( file , path, true); CACHE._decRef(old); return T;}
  1364. template<typename TYPE, Cache<TYPE> &CACHE> CacheElmPtr<TYPE,CACHE>& CacheElmPtr<TYPE,CACHE>::find (CChar8 *file, CChar *path) {TYPE *old=T._data; T._data=(TYPE*)CACHE._find (Str(file), path, true); CACHE._decRef(old); return T;}
  1365. template<typename TYPE, Cache<TYPE> &CACHE> CacheElmPtr<TYPE,CACHE>& CacheElmPtr<TYPE,CACHE>::find (C Str &file, CChar *path) {TYPE *old=T._data; T._data=(TYPE*)CACHE._find ( file , path, true); CACHE._decRef(old); return T;}
  1366. template<typename TYPE, Cache<TYPE> &CACHE> CacheElmPtr<TYPE,CACHE>& CacheElmPtr<TYPE,CACHE>::find (C Str8 &file, CChar *path) {TYPE *old=T._data; T._data=(TYPE*)CACHE._find (Str(file), path, true); CACHE._decRef(old); return T;}
  1367. template<typename TYPE, Cache<TYPE> &CACHE> CacheElmPtr<TYPE,CACHE>& CacheElmPtr<TYPE,CACHE>::find (C UID &id , CChar *path) {TYPE *old=T._data; T._data=(TYPE*)CACHE._find ( id , path, true); CACHE._decRef(old); return T;}
  1368. template<typename TYPE, Cache<TYPE> &CACHE> CacheElmPtr<TYPE,CACHE>& CacheElmPtr<TYPE,CACHE>::get (CChar *file, CChar *path) {TYPE *old=T._data; T._data=(TYPE*)CACHE._get ( file , path, true); CACHE._decRef(old); return T;}
  1369. template<typename TYPE, Cache<TYPE> &CACHE> CacheElmPtr<TYPE,CACHE>& CacheElmPtr<TYPE,CACHE>::get (CChar8 *file, CChar *path) {TYPE *old=T._data; T._data=(TYPE*)CACHE._get (Str(file), path, true); CACHE._decRef(old); return T;}
  1370. template<typename TYPE, Cache<TYPE> &CACHE> CacheElmPtr<TYPE,CACHE>& CacheElmPtr<TYPE,CACHE>::get (C Str &file, CChar *path) {TYPE *old=T._data; T._data=(TYPE*)CACHE._get ( file , path, true); CACHE._decRef(old); return T;}
  1371. template<typename TYPE, Cache<TYPE> &CACHE> CacheElmPtr<TYPE,CACHE>& CacheElmPtr<TYPE,CACHE>::get (C Str8 &file, CChar *path) {TYPE *old=T._data; T._data=(TYPE*)CACHE._get (Str(file), path, true); CACHE._decRef(old); return T;}
  1372. template<typename TYPE, Cache<TYPE> &CACHE> CacheElmPtr<TYPE,CACHE>& CacheElmPtr<TYPE,CACHE>::get (C UID &id , CChar *path) {TYPE *old=T._data; T._data=(TYPE*)CACHE._get ( id , path, true); CACHE._decRef(old); return T;}
  1373. template<typename TYPE, Cache<TYPE> &CACHE> CacheElmPtr<TYPE,CACHE>& CacheElmPtr<TYPE,CACHE>::require (CChar *file, CChar *path) {TYPE *old=T._data; T._data=(TYPE*)CACHE._require( file , path, true); CACHE._decRef(old); return T;}
  1374. template<typename TYPE, Cache<TYPE> &CACHE> CacheElmPtr<TYPE,CACHE>& CacheElmPtr<TYPE,CACHE>::require (CChar8 *file, CChar *path) {TYPE *old=T._data; T._data=(TYPE*)CACHE._require(Str(file), path, true); CACHE._decRef(old); return T;}
  1375. template<typename TYPE, Cache<TYPE> &CACHE> CacheElmPtr<TYPE,CACHE>& CacheElmPtr<TYPE,CACHE>::require (C Str &file, CChar *path) {TYPE *old=T._data; T._data=(TYPE*)CACHE._require( file , path, true); CACHE._decRef(old); return T;}
  1376. template<typename TYPE, Cache<TYPE> &CACHE> CacheElmPtr<TYPE,CACHE>& CacheElmPtr<TYPE,CACHE>::require (C Str8 &file, CChar *path) {TYPE *old=T._data; T._data=(TYPE*)CACHE._require(Str(file), path, true); CACHE._decRef(old); return T;}
  1377. template<typename TYPE, Cache<TYPE> &CACHE> CacheElmPtr<TYPE,CACHE>& CacheElmPtr<TYPE,CACHE>::require (C UID &id , CChar *path) {TYPE *old=T._data; T._data=(TYPE*)CACHE._require( id , path, true); CACHE._decRef(old); return T;}
  1378. template<typename TYPE, Cache<TYPE> &CACHE> CacheElmPtr<TYPE,CACHE>& CacheElmPtr<TYPE,CACHE>::operator=(CChar *file ) {TYPE *old=T._data; T._data=(TYPE*)CACHE._require( file , null, true); CACHE._decRef(old); return T;}
  1379. template<typename TYPE, Cache<TYPE> &CACHE> CacheElmPtr<TYPE,CACHE>& CacheElmPtr<TYPE,CACHE>::operator=(CChar8 *file ) {TYPE *old=T._data; T._data=(TYPE*)CACHE._require(Str(file), null, true); CACHE._decRef(old); return T;}
  1380. template<typename TYPE, Cache<TYPE> &CACHE> CacheElmPtr<TYPE,CACHE>& CacheElmPtr<TYPE,CACHE>::operator=(C Str &file ) {TYPE *old=T._data; T._data=(TYPE*)CACHE._require( file , null, true); CACHE._decRef(old); return T;}
  1381. template<typename TYPE, Cache<TYPE> &CACHE> CacheElmPtr<TYPE,CACHE>& CacheElmPtr<TYPE,CACHE>::operator=(C Str8 &file ) {TYPE *old=T._data; T._data=(TYPE*)CACHE._require(Str(file), null, true); CACHE._decRef(old); return T;}
  1382. template<typename TYPE, Cache<TYPE> &CACHE> CacheElmPtr<TYPE,CACHE>& CacheElmPtr<TYPE,CACHE>::operator=(C UID &id ) {TYPE *old=T._data; T._data=(TYPE*)CACHE._require( id , null, true); CACHE._decRef(old); return T;}
  1383. template<typename TYPE, Cache<TYPE> &CACHE> CacheElmPtr<TYPE,CACHE>:: CacheElmPtr( null_t ) { T._data= null ;}
  1384. template<typename TYPE, Cache<TYPE> &CACHE> CacheElmPtr<TYPE,CACHE>:: CacheElmPtr( TYPE * data) {CACHE._incRef(T._data= data);}
  1385. template<typename TYPE, Cache<TYPE> &CACHE> CacheElmPtr<TYPE,CACHE>:: CacheElmPtr(C CacheElmPtr & eptr) {CACHE._incRef(T._data=eptr._data);}
  1386. template<typename TYPE, Cache<TYPE> &CACHE> CacheElmPtr<TYPE,CACHE>:: CacheElmPtr( CacheElmPtr &&eptr) { T._data=eptr._data ; eptr._data=null;}
  1387. template<typename TYPE, Cache<TYPE> &CACHE> CacheElmPtr<TYPE,CACHE>:: CacheElmPtr( CChar * file) { T._data=(TYPE*)CACHE._require( file , null, true);}
  1388. template<typename TYPE, Cache<TYPE> &CACHE> CacheElmPtr<TYPE,CACHE>:: CacheElmPtr( CChar8 * file) { T._data=(TYPE*)CACHE._require(Str(file), null, true);}
  1389. template<typename TYPE, Cache<TYPE> &CACHE> CacheElmPtr<TYPE,CACHE>:: CacheElmPtr(C Str & file) { T._data=(TYPE*)CACHE._require( file , null, true);}
  1390. template<typename TYPE, Cache<TYPE> &CACHE> CacheElmPtr<TYPE,CACHE>:: CacheElmPtr(C Str8 & file) { T._data=(TYPE*)CACHE._require(Str(file), null, true);}
  1391. template<typename TYPE, Cache<TYPE> &CACHE> CacheElmPtr<TYPE,CACHE>:: CacheElmPtr(C UID & id ) { T._data=(TYPE*)CACHE._require( id , null, true);}
  1392. template<typename TYPE, Cache<TYPE> &CACHE> CacheElmPtr<TYPE,CACHE>::~CacheElmPtr( ) {clear();}
  1393. /******************************************************************************/
  1394. // MAP
  1395. /******************************************************************************/
  1396. T2(KEY, DATA) Map<KEY, DATA>& Map<KEY, DATA>::del () {_Map::del (); return T;}
  1397. T2(KEY, DATA) Map<KEY, DATA>& Map<KEY, DATA>::clear() {_Map::clear(); return T;}
  1398. T2(KEY, DATA) ThreadSafeMap<KEY, DATA>& ThreadSafeMap<KEY, DATA>::del () {_MapTS::del (); return T;}
  1399. T2(KEY, DATA) ThreadSafeMap<KEY, DATA>& ThreadSafeMap<KEY, DATA>::clear() {_MapTS::clear(); return T;}
  1400. T2(KEY, DATA) Int Map<KEY, DATA>::elms ()C {return _Map::elms ();}
  1401. T2(KEY, DATA) Int Map<KEY, DATA>::dataSize()C {return _Map::dataSize();}
  1402. T2(KEY, DATA) Int ThreadSafeMap<KEY, DATA>::elms ()C {return _MapTS::elms ();}
  1403. T2(KEY, DATA) Int ThreadSafeMap<KEY, DATA>::dataSize()C {return _MapTS::dataSize();}
  1404. T2(KEY, DATA) DATA* Map<KEY, DATA>::find (C KEY &key) {return (DATA*)_Map::find (&key);}
  1405. T2(KEY, DATA) DATA* Map<KEY, DATA>::get (C KEY &key) {return (DATA*)_Map::get (&key);}
  1406. T2(KEY, DATA) DATA* Map<KEY, DATA>::operator()(C KEY &key) {return (DATA*)_Map::operator()(&key);}
  1407. T2(KEY, DATA) DATA* ThreadSafeMap<KEY, DATA>::find (C KEY &key) {return (DATA*)_MapTS::find (&key);}
  1408. T2(KEY, DATA) DATA* ThreadSafeMap<KEY, DATA>::get (C KEY &key) {return (DATA*)_MapTS::get (&key);}
  1409. T2(KEY, DATA) DATA* ThreadSafeMap<KEY, DATA>::operator()(C KEY &key) {return (DATA*)_MapTS::operator()(&key);}
  1410. T2(KEY, DATA) Int Map<KEY, DATA>:: findAbsIndex(C KEY &key)C {return _Map:: findAbsIndex(&key);}
  1411. T2(KEY, DATA) Int Map<KEY, DATA>:: getAbsIndex(C KEY &key) {return _Map:: getAbsIndex(&key);}
  1412. T2(KEY, DATA) Int Map<KEY, DATA>::requireAbsIndex(C KEY &key) {return _Map::requireAbsIndex(&key);}
  1413. T2(KEY, DATA) Int ThreadSafeMap<KEY, DATA>:: findAbsIndex(C KEY &key)C {return _MapTS:: findAbsIndex(&key);}
  1414. T2(KEY, DATA) Int ThreadSafeMap<KEY, DATA>:: getAbsIndex(C KEY &key) {return _MapTS:: getAbsIndex(&key);}
  1415. T2(KEY, DATA) Int ThreadSafeMap<KEY, DATA>::requireAbsIndex(C KEY &key) {return _MapTS::requireAbsIndex(&key);}
  1416. T2(KEY, DATA) Bool Map<KEY, DATA>::containsKey (C KEY &key )C {return _Map::containsKey (&key );}
  1417. T2(KEY, DATA) Bool Map<KEY, DATA>::containsData (C DATA *data)C {return _Map::containsData ( data);}
  1418. T2(KEY, DATA) C KEY* Map<KEY, DATA>::dataToKey (C DATA *data)C {return (KEY*)_Map::dataToKey ( data);}
  1419. T2(KEY, DATA) C KEY* Map<KEY, DATA>::dataInMapToKey(C DATA *data)C {return (KEY*)_Map::dataInMapToKeyPtr( data);}
  1420. T2(KEY, DATA) C KEY& Map<KEY, DATA>::dataInMapToKey(C DATA &data)C {return *(KEY*)_Map::dataInMapToKeyRef(&data);}
  1421. T2(KEY, DATA) Int Map<KEY, DATA>::dataToIndex (C DATA *data)C {return _Map::dataToIndex ( data);}
  1422. T2(KEY, DATA) Bool ThreadSafeMap<KEY, DATA>::containsKey (C KEY &key )C {return _MapTS::containsKey (&key );}
  1423. T2(KEY, DATA) Bool ThreadSafeMap<KEY, DATA>::containsData (C DATA *data)C {return _MapTS::containsData ( data);}
  1424. T2(KEY, DATA) C KEY* ThreadSafeMap<KEY, DATA>::dataToKey (C DATA *data)C {return (KEY*)_MapTS::dataToKey ( data);}
  1425. T2(KEY, DATA) C KEY* ThreadSafeMap<KEY, DATA>::dataInMapToKey(C DATA *data)C {return (KEY*)_MapTS::dataInMapToKeyPtr( data);}
  1426. T2(KEY, DATA) C KEY& ThreadSafeMap<KEY, DATA>::dataInMapToKey(C DATA &data)C {return *(KEY*)_MapTS::dataInMapToKeyRef(&data);}
  1427. T2(KEY, DATA) Int ThreadSafeMap<KEY, DATA>::dataToIndex (C DATA *data)C {return _MapTS::dataToIndex ( data);}
  1428. T2(KEY, DATA) C KEY & Map<KEY, DATA>::key (Int i)C {return *(KEY *)_Map::key (i);}
  1429. T2(KEY, DATA) DATA& Map<KEY, DATA>::operator[](Int i) {return *(DATA*)_Map::operator[](i);}
  1430. T2(KEY, DATA) C DATA& Map<KEY, DATA>::operator[](Int i)C {return *(DATA*)_Map::operator[](i);}
  1431. T2(KEY, DATA) C KEY & Map<KEY, DATA>::absKey (Int abs_i)C {return *(KEY *)_Map::absKey (abs_i);}
  1432. T2(KEY, DATA) DATA& Map<KEY, DATA>::absData(Int abs_i) {return *(DATA*)_Map::absData(abs_i);}
  1433. T2(KEY, DATA) C DATA& Map<KEY, DATA>::absData(Int abs_i)C {return *(DATA*)_Map::absData(abs_i);}
  1434. T2(KEY, DATA) C KEY & ThreadSafeMap<KEY, DATA>::lockedKey (Int i)C {return *(KEY *)_MapTS::key (i);}
  1435. T2(KEY, DATA) DATA& ThreadSafeMap<KEY, DATA>::lockedData(Int i) {return *(DATA*)_MapTS::operator[](i);}
  1436. T2(KEY, DATA) C DATA& ThreadSafeMap<KEY, DATA>::lockedData(Int i)C {return *(DATA*)_MapTS::operator[](i);}
  1437. T2(KEY, DATA) C KEY & ThreadSafeMap<KEY, DATA>::lockedAbsKey (Int abs_i)C {return *(KEY *)_MapTS::absKey (abs_i);}
  1438. T2(KEY, DATA) DATA& ThreadSafeMap<KEY, DATA>::lockedAbsData(Int abs_i) {return *(DATA*)_MapTS::absData(abs_i);}
  1439. T2(KEY, DATA) C DATA& ThreadSafeMap<KEY, DATA>::lockedAbsData(Int abs_i)C {return *(DATA*)_MapTS::absData(abs_i);}
  1440. T2(KEY, DATA) void ThreadSafeMap<KEY, DATA>:: lock()C {_MapTS:: lock();}
  1441. T2(KEY, DATA) void ThreadSafeMap<KEY, DATA>::unlock()C {_MapTS::unlock();}
  1442. T2(KEY, DATA) MAP_MODE Map<KEY, DATA>::mode(MAP_MODE mode) {return (MAP_MODE)_Map ::mode(mode);}
  1443. T2(KEY, DATA) MAP_MODE ThreadSafeMap<KEY, DATA>::mode(MAP_MODE mode) {return (MAP_MODE)_MapTS::mode(mode);}
  1444. T2(KEY, DATA) void Map<KEY, DATA>::remove ( Int i ) { _Map::remove ( i );}
  1445. T2(KEY, DATA) void Map<KEY, DATA>::removeKey (C KEY &key ) { _Map::removeKey (&key );}
  1446. T2(KEY, DATA) void Map<KEY, DATA>::removeData(C DATA *data ) { _Map::removeData( data);}
  1447. T2(KEY, DATA) Bool Map<KEY, DATA>::replaceKey(C KEY &src, C KEY &dest) {return _Map::replaceKey(&src, &dest);}
  1448. T2(KEY, DATA) void ThreadSafeMap<KEY, DATA>::remove ( Int i ) { _MapTS::remove ( i );}
  1449. T2(KEY, DATA) void ThreadSafeMap<KEY, DATA>::removeKey (C KEY &key ) { _MapTS::removeKey (&key );}
  1450. T2(KEY, DATA) void ThreadSafeMap<KEY, DATA>::removeData(C DATA *data ) { _MapTS::removeData( data);}
  1451. T2(KEY, DATA) Bool ThreadSafeMap<KEY, DATA>::replaceKey(C KEY &src, C KEY &dest) {return _MapTS::replaceKey(&src, &dest);}
  1452. T2(KEY, DATA) T1(EXTENDED) Map<KEY, DATA>& Map<KEY, DATA>::replaceClass() {ASSERT_BASE_EXTENDED<DATA, EXTENDED>(); del(); _key_offset=UIntPtr(&((typename Map<KEY, EXTENDED>::Elm*)null)->key); /*_data_offset=UIntPtr(&((typename Map<KEY, EXTENDED>::Elm*)null)->data);*/ _desc_offset=UIntPtr(&((typename Map<KEY, EXTENDED>::Elm*)null)->desc); _data_size=SIZE(EXTENDED); _memx.replaceClass<typename Map<KEY, EXTENDED>::Elm>(); return T;}
  1453. T2(KEY, DATA) T1(EXTENDED) ThreadSafeMap<KEY, DATA>& ThreadSafeMap<KEY, DATA>::replaceClass() {ASSERT_BASE_EXTENDED<DATA, EXTENDED>(); lock(); del(); _key_offset=UIntPtr(&((typename Map<KEY, EXTENDED>::Elm*)null)->key); /*_data_offset=UIntPtr(&((typename Map<KEY, EXTENDED>::Elm*)null)->data);*/ _desc_offset=UIntPtr(&((typename Map<KEY, EXTENDED>::Elm*)null)->desc); _data_size=SIZE(EXTENDED); _memx.replaceClass<typename Map<KEY, EXTENDED>::Elm>(); unlock(); return T;}
  1454. T2(KEY, DATA) Map<KEY, DATA>& Map<KEY, DATA>::operator=(C Map<KEY, DATA> &src) {if(this!=&src){ from(src); FREPA(T) T[i]=src [i]; } return T;}
  1455. T2(KEY, DATA) ThreadSafeMap<KEY, DATA>& ThreadSafeMap<KEY, DATA>::operator=(C ThreadSafeMap<KEY, DATA> &src) {if(this!=&src){lock(); src.lock(); from(src); FREPA(T)lockedData(i)=src.lockedData(i); src.unlock(); unlock();} return T;}
  1456. T2(KEY, DATA) Map<KEY, DATA>:: Map(Int compare(C KEY &a, C KEY &b), Bool create(DATA &data, C KEY &key, Ptr user), Ptr user, Int block_elms) : _Map (block_elms, (Int(*)(CPtr, CPtr))compare, (Bool(*)(Ptr, CPtr, Ptr))create, user, ClassFunc<KEY>::Copy) {replaceClass<DATA>();}
  1457. T2(KEY, DATA) ThreadSafeMap<KEY, DATA>::ThreadSafeMap(Int compare(C KEY &a, C KEY &b), Bool create(DATA &data, C KEY &key, Ptr user), Ptr user, Int block_elms) : _MapTS(block_elms, (Int(*)(CPtr, CPtr))compare, (Bool(*)(Ptr, CPtr, Ptr))create, user, ClassFunc<KEY>::Copy) {replaceClass<DATA>();}
  1458. inline Int Elms(C _Map &map) {return map.elms();}
  1459. /******************************************************************************/
  1460. // GRID
  1461. /******************************************************************************/
  1462. T1(TYPE) void Grid<TYPE>:: del( ) { _Grid::del ( );} // delete all cells
  1463. T1(TYPE) void Grid<TYPE>:: del(Cell<TYPE> *cell) { _Grid::del ((_Cell*)cell);} // delete selected cell
  1464. T1(TYPE) Cell<TYPE>& Grid<TYPE>:: get(C VecI2 &xy ) {return (Cell<TYPE>&)_Grid::get (xy );} // get 'xy' cell, create it if not found
  1465. T1(TYPE) Cell<TYPE>* Grid<TYPE>::find(C VecI2 &xy )C {return (Cell<TYPE>*)_Grid::find(xy );} // get 'xy' cell, return null if not found
  1466. T1(TYPE) Bool Grid<TYPE>::size( RectI &rect )C {return _Grid::size(rect );} // get rectangle covering all grid cells, false on fail (if no grid cells are present)
  1467. T1(TYPE) Grid<TYPE>& Grid<TYPE>::fastAccess (C RectI *rect) {_Grid::fastAccess (rect); return T;} // optimize accessing cells (via 'find/get' methods) within 'rect' rectangle, normally cells are accessed recursively, however after calling this method all cells within the rectangle will be available instantly, if null is provided then the optimization is disabled
  1468. T1(TYPE) T1(EXTENDED) Grid<TYPE>& Grid<TYPE>::replaceClass( ) {_Grid::replaceClass<TYPE, EXTENDED>( ); return T;} // replace the type of class stored in the grid, all grid cells are automatically removed before changing the type of the class, the new type must be extended from the base 'TYPE' (if you're receiving a compilation error pointing to this method this means that the new class isn't extended from the base class)
  1469. // call custom function on grid cells
  1470. T1(TYPE) void Grid<TYPE>::func ( void func(Cell<TYPE> &cell, Ptr user) ) {_Grid::func ( (void (*)(_Cell &cell, Ptr user))func, null);} // call 'func' on all existing grid cells
  1471. T1(TYPE) T1(USER_DATA) void Grid<TYPE>::func ( void func(Cell<TYPE> &cell, USER_DATA *user), USER_DATA *user) {_Grid::func ( (void (*)(_Cell &cell, Ptr user))func, user);} // call 'func' on all existing grid cells
  1472. T1(TYPE) T1(USER_DATA) void Grid<TYPE>::func ( void func(Cell<TYPE> &cell, USER_DATA &user), USER_DATA &user) {_Grid::func ( (void (*)(_Cell &cell, Ptr user))func, &user);} // call 'func' on all existing grid cells
  1473. T1(TYPE) void Grid<TYPE>::func (C RectI &rect, void func(Cell<TYPE> &cell, Ptr user) ) {_Grid::func (rect, (void (*)(_Cell &cell, Ptr user))func, null);} // call 'func' on all existing grid cells in specified rectangle
  1474. T1(TYPE) T1(USER_DATA) void Grid<TYPE>::func (C RectI &rect, void func(Cell<TYPE> &cell, USER_DATA *user), USER_DATA *user) {_Grid::func (rect, (void (*)(_Cell &cell, Ptr user))func, user);} // call 'func' on all existing grid cells in specified rectangle
  1475. T1(TYPE) T1(USER_DATA) void Grid<TYPE>::func (C RectI &rect, void func(Cell<TYPE> &cell, USER_DATA &user), USER_DATA &user) {_Grid::func (rect, (void (*)(_Cell &cell, Ptr user))func, &user);} // call 'func' on all existing grid cells in specified rectangle
  1476. T1(TYPE) void Grid<TYPE>::funcCreate(C RectI &rect, void func(Cell<TYPE> &cell, Ptr user) ) {_Grid::funcCreate(rect, (void (*)(_Cell &cell, Ptr user))func, null);} // call 'func' on all grid cells in specified rectangle (this method creates grid cells if they don't exist yet)
  1477. T1(TYPE) T1(USER_DATA) void Grid<TYPE>::funcCreate(C RectI &rect, void func(Cell<TYPE> &cell, USER_DATA *user), USER_DATA *user) {_Grid::funcCreate(rect, (void (*)(_Cell &cell, Ptr user))func, user);} // call 'func' on all grid cells in specified rectangle (this method creates grid cells if they don't exist yet)
  1478. T1(TYPE) T1(USER_DATA) void Grid<TYPE>::funcCreate(C RectI &rect, void func(Cell<TYPE> &cell, USER_DATA &user), USER_DATA &user) {_Grid::funcCreate(rect, (void (*)(_Cell &cell, Ptr user))func, &user);} // call 'func' on all grid cells in specified rectangle (this method creates grid cells if they don't exist yet)
  1479. // call custom function on grid cells (multi-threaded version)
  1480. T1(TYPE) void Grid<TYPE>::mtFunc(Threads &threads, void func(Cell<TYPE> &cell, Ptr user, Int thread_index) ) {_Grid::mtFunc(threads, (void (*)(_Cell &cell, Ptr user, Int thread_index))func, null);} // call 'func' on all existing grid cells
  1481. T1(TYPE) T1(USER_DATA) void Grid<TYPE>::mtFunc(Threads &threads, void func(Cell<TYPE> &cell, USER_DATA *user, Int thread_index), USER_DATA *user) {_Grid::mtFunc(threads, (void (*)(_Cell &cell, Ptr user, Int thread_index))func, user);} // call 'func' on all existing grid cells
  1482. T1(TYPE) T1(USER_DATA) void Grid<TYPE>::mtFunc(Threads &threads, void func(Cell<TYPE> &cell, USER_DATA &user, Int thread_index), USER_DATA &user) {_Grid::mtFunc(threads, (void (*)(_Cell &cell, Ptr user, Int thread_index))func, &user);} // call 'func' on all existing grid cells
  1483. T1(TYPE) void Grid<TYPE>::mtFunc(Threads &threads, C RectI &rect, void func(Cell<TYPE> &cell, Ptr user, Int thread_index) ) {_Grid::mtFunc(threads, rect, (void (*)(_Cell &cell, Ptr user, Int thread_index))func, null);} // call 'func' on all existing grid cells in specified rectangle
  1484. T1(TYPE) T1(USER_DATA) void Grid<TYPE>::mtFunc(Threads &threads, C RectI &rect, void func(Cell<TYPE> &cell, USER_DATA *user, Int thread_index), USER_DATA *user) {_Grid::mtFunc(threads, rect, (void (*)(_Cell &cell, Ptr user, Int thread_index))func, user);} // call 'func' on all existing grid cells in specified rectangle
  1485. T1(TYPE) T1(USER_DATA) void Grid<TYPE>::mtFunc(Threads &threads, C RectI &rect, void func(Cell<TYPE> &cell, USER_DATA &user, Int thread_index), USER_DATA &user) {_Grid::mtFunc(threads, rect, (void (*)(_Cell &cell, Ptr user, Int thread_index))func, &user);} // call 'func' on all existing grid cells in specified rectangle
  1486. /******************************************************************************/
  1487. // GAME::OBJ_MEMX
  1488. /******************************************************************************/
  1489. namespace Game
  1490. {
  1491. T1(TYPE) ObjMap<TYPE>& ObjMap<TYPE>::clear() {_map.clear(); return T;}
  1492. T1(TYPE) Int ObjMap<TYPE>::elms ()C {return _map.elms ();}
  1493. T1(TYPE) Int ObjMap<TYPE>::elmSize()C {return _map.dataSize();}
  1494. T1(TYPE) TYPE& ObjMap<TYPE>::operator[](Int i) {return _map[i];}
  1495. T1(TYPE) C TYPE& ObjMap<TYPE>::operator[](Int i)C {return _map[i];}
  1496. T1(TYPE) Bool ObjMap<TYPE>::containsId (C UID &obj_id)C {return obj_id.valid() ? _map.containsKey (obj_id) : false;}
  1497. T1(TYPE) Bool ObjMap<TYPE>::containsObj(C TYPE *obj )C {return _map.containsData(obj ) ;}
  1498. T1(TYPE) TYPE* ObjMap<TYPE>::find(C UID &obj_id) {return obj_id.valid() ? _map.find(obj_id) : null;}
  1499. T1(TYPE) ObjMap<TYPE>& ObjMap<TYPE>::remove ( Int i ) { _map.remove (i ); return T;}
  1500. T1(TYPE) ObjMap<TYPE>& ObjMap<TYPE>::removeId (C UID &obj_id) {if(obj_id.valid())_map.removeKey (obj_id); return T;}
  1501. T1(TYPE) ObjMap<TYPE>& ObjMap<TYPE>::removeObj(C TYPE *data ) { _map.removeData(data ); return T;}
  1502. T1(TYPE) T1(BASE) ObjMap<TYPE>::operator ObjMap<BASE>&() {ASSERT_BASE_EXTENDED<BASE, TYPE>(); return *( ObjMap<BASE>*)this;}
  1503. T1(TYPE) T1(BASE) ObjMap<TYPE>::operator C ObjMap<BASE>&()C {ASSERT_BASE_EXTENDED<BASE, TYPE>(); return *(C ObjMap<BASE>*)this;}
  1504. T1(TYPE) ObjMap<TYPE>::ObjMap(Int block_elms) : _map(Compare, null, null, block_elms) {}
  1505. }
  1506. T1(TYPE) Int Elms(C Game::ObjMap<TYPE> &obj_map) {return obj_map.elms();}
  1507. /******************************************************************************/
  1508. // LIST
  1509. /******************************************************************************/
  1510. T1(TYPE) _List& _List::setData (TYPE *data, Int elms, C MemPtr<Bool> &visible, Bool keep_cur) {return _setData( data , elms , SIZE(TYPE), visible, keep_cur);}
  1511. T1(TYPE) _List& _List::setData (Mems<TYPE> &mems, C MemPtr<Bool> &visible, Bool keep_cur) {return _setData(mems.data(), mems.elms(), mems.elmSize(), visible, keep_cur);}
  1512. T1(TYPE) _List& _List::setDataNode(Memx<TYPE> &memx, C MemPtr<Bool> &visible, Bool keep_cur) {return _setData(memx , OFFSET(TYPE, children), visible, keep_cur); Memx<TYPE> &temp=MEMBER(TYPE, children);} // temp assignment verifies that 'children' member can be casted to 'Memx<TYPE>' which is a requirement
  1513. /******************************************************************************/
  1514. // INTERPOLATOR
  1515. /******************************************************************************/
  1516. T1(TYPE) AngularInterpolator<TYPE>::AngularInterpolator() {_value=_prev=_cur=_next=0;}
  1517. T1(TYPE) LinearInterpolator<TYPE>:: LinearInterpolator() {_value=_prev=_cur=_next=0;}
  1518. T1(TYPE) SplineInterpolator<TYPE>:: SplineInterpolator() {_value=_prev2=_prev=_cur=_next=0;}
  1519. T1(TYPE) void AngularInterpolator<TYPE>::add(C TYPE &value, C InterpolatorTemp &temp)
  1520. {
  1521. switch(temp.op)
  1522. {
  1523. case 0: _prev=_value=value; break; // initialize '_value' already so we can access it ASAP
  1524. case 1: _cur =_prev+AngleDelta(_prev, value); break;
  1525. case 2: _prev=_value; _cur =_prev+AngleDelta(_prev, value); break; // start interpolating from current value
  1526. case 3: _next=_cur +AngleDelta(_cur , value); break;
  1527. }
  1528. }
  1529. T1(TYPE) void LinearInterpolator<TYPE>::add(C TYPE &value, C InterpolatorTemp &temp)
  1530. {
  1531. switch(temp.op)
  1532. {
  1533. case 0: _prev=_value=value; break; // initialize '_value' already so we can access it ASAP
  1534. case 1: _cur =value; break;
  1535. case 2: _prev=_value; _cur =value; break; // start interpolating from current value
  1536. case 3: _next=value; break;
  1537. }
  1538. }
  1539. T1(TYPE) void SplineInterpolator<TYPE>::add(C TYPE &value, C InterpolatorTemp &temp)
  1540. {
  1541. switch(temp.op)
  1542. {
  1543. case 0: _prev=_prev2=_value=value; break; // initialize '_value' already so we can access it ASAP
  1544. case 1: _cur =value; break;
  1545. case 2: _prev=_value; _cur =value; break; // start interpolating from current value
  1546. case 3: _next=value; break;
  1547. }
  1548. }
  1549. T1(TYPE) void AngularInterpolator<TYPE>::update(C InterpolatorTemp &temp) {if(temp.op){ _prev=_cur; _cur=_next;} _value=Lerp ( _prev, _cur, temp.frac);}
  1550. T1(TYPE) void LinearInterpolator<TYPE>::update(C InterpolatorTemp &temp) {if(temp.op){ _prev=_cur; _cur=_next;} _value=Lerp ( _prev, _cur, temp.frac);}
  1551. T1(TYPE) void SplineInterpolator<TYPE>::update(C InterpolatorTemp &temp) {if(temp.op){_prev2=_prev; _prev=_cur; _cur=_next;} _value=Lerp4(_prev2, _prev, _cur, _cur-_prev+_cur, temp.frac);} // predict next instead of using '_next' because we may not know it in all cases
  1552. /******************************************************************************/
  1553. // IO
  1554. /******************************************************************************/
  1555. T1(TYPE) void FList(C Str &path, FILE_LIST_MODE func(C FileFind &ff, TYPE *user), TYPE *user) {FList(path, (FILE_LIST_MODE (*)(C FileFind &ff, Ptr user))func, user);}
  1556. T1(TYPE) void FList(C Str &path, FILE_LIST_MODE func(C FileFind &ff, TYPE &user), TYPE &user) {FList(path, (FILE_LIST_MODE (*)(C FileFind &ff, Ptr user))func, &user);}
  1557. /******************************************************************************/
  1558. // GUI
  1559. /******************************************************************************/
  1560. T1(TYPE) ListColumn::ListColumn(TYPE &member , Flt width, C Str &name) : md(member) {create(null , width, name);}
  1561. T1(TYPE) ListColumn::ListColumn(Str (*data_to_text)(C TYPE &data), Flt width, C Str &name) {create((Str(*)(CPtr data))data_to_text, width, name);}
  1562. /******************************************************************************/
  1563. // GRAPHICS
  1564. /******************************************************************************/
  1565. #if EE_PRIVATE
  1566. INLINE Int Display::maxShaderMatrixes()C
  1567. {
  1568. #if DX9
  1569. return MAX_MATRIX_DX9;
  1570. #elif DX11
  1571. return MAX_MATRIX_DX10;
  1572. #elif GL
  1573. #if VARIABLE_MAX_MATRIX
  1574. return MeshBoneSplit ? MAX_MATRIX_DX9 : MAX_MATRIX_DX10;
  1575. #else
  1576. return MAX_MATRIX_DX9;
  1577. #endif
  1578. #endif
  1579. }
  1580. INLINE Bool Display::meshStorageSigned()C
  1581. {
  1582. #if DX9
  1583. return false;
  1584. #elif DX11
  1585. return true;
  1586. #elif GL
  1587. return true;
  1588. #endif
  1589. }
  1590. INLINE Bool Display::meshBoneSplit()C
  1591. {
  1592. #if DX9
  1593. return true;
  1594. #elif DX11
  1595. return false;
  1596. #elif GL
  1597. #if VARIABLE_MAX_MATRIX
  1598. return MeshBoneSplit;
  1599. #else
  1600. return true;
  1601. #endif
  1602. #endif
  1603. }
  1604. INLINE Bool Display::hwInstancing()C
  1605. {
  1606. #if DX9
  1607. return false;
  1608. #elif DX11
  1609. return true;
  1610. #elif GL
  1611. return notShaderModelGLES2(); // GL 3.1 or GLES 3+
  1612. #endif
  1613. }
  1614. INLINE Bool Display::signedNrmRT()C // #SIGNED_NRM_RT
  1615. {
  1616. #if DX9
  1617. return false;
  1618. #elif DX11
  1619. return true;
  1620. #elif GL
  1621. return false;
  1622. #endif
  1623. }
  1624. INLINE Bool Display::signedVelRT()C // #SIGNED_VEL_RT
  1625. {
  1626. #if DX9
  1627. return false;
  1628. #elif DX11
  1629. return true;
  1630. #elif GL
  1631. return false;
  1632. #endif
  1633. }
  1634. #endif
  1635. /******************************************************************************/
  1636. // SOUND
  1637. /******************************************************************************/
  1638. inline Int SndOpusEncoder::frequency ()C {return _frequency;}
  1639. inline Int SndOpusEncoder::bytes ()C {return _encoder.bytes();}
  1640. inline Int SndOpusEncoder::bits ()C {return _encoder.bits();}
  1641. inline Int SndOpusEncoder::channels ()C {return _encoder.channels();}
  1642. inline Int SndOpusEncoder::block ()C {return _encoder.block();}
  1643. inline Int SndOpusEncoder::frameSamples()C {return _encoder.frameSamples();}
  1644. /******************************************************************************/
  1645. // EDIT
  1646. /******************************************************************************/
  1647. namespace Edit
  1648. {
  1649. inline Int _Undo::changes()C {return _changes.elms();}
  1650. T1(TYPE) Undo<TYPE>::Undo(Bool full, Ptr user, Flt time) : _Undo(full, user, time) {replaceClass<TYPE>();}
  1651. T1(TYPE) TYPE* Undo<TYPE>::getNextUndo() {return (TYPE*)_Undo::getNextUndo();}
  1652. T1(TYPE) TYPE* Undo<TYPE>::getNextRedo() {return (TYPE*)_Undo::getNextRedo();}
  1653. T1(TYPE) TYPE& Undo<TYPE>::operator[](Int i) {return (TYPE&)_Undo::operator[](i);}
  1654. T1(TYPE) TYPE* Undo<TYPE>::addr (Int i) {return (TYPE*)_Undo::addr (i);}
  1655. T1(TYPE) TYPE* Undo<TYPE>::set(CPtr change_type, Bool force_create, Flt extra_time) {return (TYPE*)_Undo::set(change_type, force_create, extra_time);}
  1656. T1(TYPE) TYPE* Undo<TYPE>::set( Int change_type, Bool force_create, Flt extra_time) {return (TYPE*)_Undo::set(change_type, force_create, extra_time);}
  1657. T1(TYPE) T1(CHANGE) Undo<TYPE>& Undo<TYPE>::replaceClass() {ASSERT_BASE_EXTENDED<TYPE, CHANGE>(); _changes.replaceClass<CHANGE>(); return T;}
  1658. }
  1659. /******************************************************************************/
  1660. #if EE_PRIVATE
  1661. #if (defined _M_IX86 || defined __i386__) || (defined _M_X64 || defined __x86_64__) || (ARM && X64) || WEB // x86 32/64 and ARM 64 can do unaligned reads. When using WebAssembly (WASM) for WEB platform, unaligned access is supported, however when executed on platforms without native unaligned access support (Arm32) it will be extremely slow, however since Arm32 is in extinction then it's better to enable unaligned access to get better performance on majority of platforms that support it.
  1662. T1(TYPE) C TYPE& Unaligned( C TYPE &src) {return src;}
  1663. T1(TYPE) void Unaligned(TYPE &dest, C TYPE &src) { dest=src;}
  1664. T1(TYPE) void _Unaligned(Byte &dest, C TYPE &src) { dest=src;}
  1665. T1(TYPE) void _Unaligned(UShort &dest, C TYPE &src) { dest=src;}
  1666. T1(TYPE) void _Unaligned(Int &dest, C TYPE &src) { dest=src;}
  1667. T1(TYPE) void _Unaligned(UInt &dest, C TYPE &src) { dest=src;}
  1668. #else
  1669. T1(TYPE) TYPE Unaligned( C TYPE &src) {if(SIZE(TYPE)==1)return src;else{TYPE temp; CopyFast(Ptr(&temp), CPtr(&src), SIZE(TYPE)); return temp;}} // !! these functions must casted to 'Ptr', because without it, compiler may try to inline the 'memcpy' when it detects that both params are of the same type and in that case it will assume that they are memory aligned and crash will occur !!
  1670. T1(TYPE) void Unaligned(TYPE &dest, C TYPE &src) {if(SIZE(TYPE)==1) dest=src;else{ CopyFast(Ptr(&dest), CPtr(&src), SIZE(TYPE)); }} // !! these functions must casted to 'Ptr', because without it, compiler may try to inline the 'memcpy' when it detects that both params are of the same type and in that case it will assume that they are memory aligned and crash will occur !!
  1671. T1(TYPE) void _Unaligned(Byte &dest, C TYPE &src) { dest=Unaligned(src) ; }
  1672. T1(TYPE) void _Unaligned(UShort &dest, C TYPE &src) {Unaligned(dest, (UShort)Unaligned(src)); }
  1673. T1(TYPE) void _Unaligned(Int &dest, C TYPE &src) {Unaligned(dest, (Int )Unaligned(src)); }
  1674. T1(TYPE) void _Unaligned(UInt &dest, C TYPE &src) {Unaligned(dest, (UInt )Unaligned(src)); }
  1675. #endif
  1676. T2(TA, TB) File& File::putMulti(C TA &a, C TB &b)
  1677. {
  1678. C Int size=SIZE(a)+SIZE(b);
  1679. Byte buf[size];
  1680. Unaligned((TA&)(buf[0]), a);
  1681. Unaligned((TB&)(buf[SIZE(a)]), b);
  1682. T<<buf;
  1683. return T;
  1684. }
  1685. T2(TA, TB) File& File::getMulti(TA &a, TB &b)
  1686. {
  1687. C Int size=SIZE(a)+SIZE(b);
  1688. Byte buf[size]; T>>buf;
  1689. Unaligned(a, (TA&)(buf[0]));
  1690. Unaligned(b, (TB&)(buf[SIZE(a)]));
  1691. return T;
  1692. }
  1693. T3(TA, TB, TC) File& File::putMulti(C TA &a, C TB &b, C TC &c)
  1694. {
  1695. C Int size=SIZE(a)+SIZE(b)+SIZE(c);
  1696. Byte buf[size];
  1697. Unaligned((TA&)(buf[0]), a);
  1698. Unaligned((TB&)(buf[SIZE(a)]), b);
  1699. Unaligned((TC&)(buf[SIZE(a)+SIZE(b)]), c);
  1700. T<<buf;
  1701. return T;
  1702. }
  1703. T3(TA, TB, TC) File& File::getMulti(TA &a, TB &b, TC &c)
  1704. {
  1705. C Int size=SIZE(a)+SIZE(b)+SIZE(c);
  1706. Byte buf[size]; T>>buf;
  1707. Unaligned(a, (TA&)(buf[0]));
  1708. Unaligned(b, (TB&)(buf[SIZE(a)]));
  1709. Unaligned(c, (TC&)(buf[SIZE(a)+SIZE(b)]));
  1710. return T;
  1711. }
  1712. T4(TA, TB, TC, TD) File& File::putMulti(C TA &a, C TB &b, C TC &c, C TD &d)
  1713. {
  1714. C Int size=SIZE(a)+SIZE(b)+SIZE(c)+SIZE(d);
  1715. Byte buf[size];
  1716. Unaligned((TA&)(buf[0]), a);
  1717. Unaligned((TB&)(buf[SIZE(a)]), b);
  1718. Unaligned((TC&)(buf[SIZE(a)+SIZE(b)]), c);
  1719. Unaligned((TD&)(buf[SIZE(a)+SIZE(b)+SIZE(c)]), d);
  1720. T<<buf;
  1721. return T;
  1722. }
  1723. T4(TA, TB, TC, TD) File& File::getMulti(TA &a, TB &b, TC &c, TD &d)
  1724. {
  1725. C Int size=SIZE(a)+SIZE(b)+SIZE(c)+SIZE(d);
  1726. Byte buf[size]; T>>buf;
  1727. Unaligned(a, (TA&)(buf[0]));
  1728. Unaligned(b, (TB&)(buf[SIZE(a)]));
  1729. Unaligned(c, (TC&)(buf[SIZE(a)+SIZE(b)]));
  1730. Unaligned(d, (TD&)(buf[SIZE(a)+SIZE(b)+SIZE(c)]));
  1731. return T;
  1732. }
  1733. T5(TA, TB, TC, TD, TE) File& File::putMulti(C TA &a, C TB &b, C TC &c, C TD &d, C TE &e)
  1734. {
  1735. C Int size=SIZE(a)+SIZE(b)+SIZE(c)+SIZE(d)+SIZE(e);
  1736. Byte buf[size];
  1737. Unaligned((TA&)(buf[0]), a);
  1738. Unaligned((TB&)(buf[SIZE(a)]), b);
  1739. Unaligned((TC&)(buf[SIZE(a)+SIZE(b)]), c);
  1740. Unaligned((TD&)(buf[SIZE(a)+SIZE(b)+SIZE(c)]), d);
  1741. Unaligned((TE&)(buf[SIZE(a)+SIZE(b)+SIZE(c)+SIZE(d)]), e);
  1742. T<<buf;
  1743. return T;
  1744. }
  1745. T5(TA, TB, TC, TD, TE) File& File::getMulti(TA &a, TB &b, TC &c, TD &d, TE &e)
  1746. {
  1747. C Int size=SIZE(a)+SIZE(b)+SIZE(c)+SIZE(d)+SIZE(e);
  1748. Byte buf[size]; T>>buf;
  1749. Unaligned(a, (TA&)(buf[0]));
  1750. Unaligned(b, (TB&)(buf[SIZE(a)]));
  1751. Unaligned(c, (TC&)(buf[SIZE(a)+SIZE(b)]));
  1752. Unaligned(d, (TD&)(buf[SIZE(a)+SIZE(b)+SIZE(c)]));
  1753. Unaligned(e, (TE&)(buf[SIZE(a)+SIZE(b)+SIZE(c)+SIZE(d)]));
  1754. return T;
  1755. }
  1756. T6(TA, TB, TC, TD, TE, TF) File& File::putMulti(C TA &a, C TB &b, C TC &c, C TD &d, C TE &e, C TF &f)
  1757. {
  1758. C Int size=SIZE(a)+SIZE(b)+SIZE(c)+SIZE(d)+SIZE(e)+SIZE(f);
  1759. Byte buf[size];
  1760. Unaligned((TA&)(buf[0]), a);
  1761. Unaligned((TB&)(buf[SIZE(a)]), b);
  1762. Unaligned((TC&)(buf[SIZE(a)+SIZE(b)]), c);
  1763. Unaligned((TD&)(buf[SIZE(a)+SIZE(b)+SIZE(c)]), d);
  1764. Unaligned((TE&)(buf[SIZE(a)+SIZE(b)+SIZE(c)+SIZE(d)]), e);
  1765. Unaligned((TF&)(buf[SIZE(a)+SIZE(b)+SIZE(c)+SIZE(d)+SIZE(e)]), f);
  1766. T<<buf;
  1767. return T;
  1768. }
  1769. T6(TA, TB, TC, TD, TE, TF) File& File::getMulti(TA &a, TB &b, TC &c, TD &d, TE &e, TF &f)
  1770. {
  1771. C Int size=SIZE(a)+SIZE(b)+SIZE(c)+SIZE(d)+SIZE(e)+SIZE(f);
  1772. Byte buf[size]; T>>buf;
  1773. Unaligned(a, (TA&)(buf[0]));
  1774. Unaligned(b, (TB&)(buf[SIZE(a)]));
  1775. Unaligned(c, (TC&)(buf[SIZE(a)+SIZE(b)]));
  1776. Unaligned(d, (TD&)(buf[SIZE(a)+SIZE(b)+SIZE(c)]));
  1777. Unaligned(e, (TE&)(buf[SIZE(a)+SIZE(b)+SIZE(c)+SIZE(d)]));
  1778. Unaligned(f, (TF&)(buf[SIZE(a)+SIZE(b)+SIZE(c)+SIZE(d)+SIZE(e)]));
  1779. return T;
  1780. }
  1781. T7(TA, TB, TC, TD, TE, TF, TG) File& File::putMulti(C TA &a, C TB &b, C TC &c, C TD &d, C TE &e, C TF &f, C TG &g)
  1782. {
  1783. C Int size=SIZE(a)+SIZE(b)+SIZE(c)+SIZE(d)+SIZE(e)+SIZE(f)+SIZE(g);
  1784. Byte buf[size];
  1785. Unaligned((TA&)(buf[0]), a);
  1786. Unaligned((TB&)(buf[SIZE(a)]), b);
  1787. Unaligned((TC&)(buf[SIZE(a)+SIZE(b)]), c);
  1788. Unaligned((TD&)(buf[SIZE(a)+SIZE(b)+SIZE(c)]), d);
  1789. Unaligned((TE&)(buf[SIZE(a)+SIZE(b)+SIZE(c)+SIZE(d)]), e);
  1790. Unaligned((TF&)(buf[SIZE(a)+SIZE(b)+SIZE(c)+SIZE(d)+SIZE(e)]), f);
  1791. Unaligned((TG&)(buf[SIZE(a)+SIZE(b)+SIZE(c)+SIZE(d)+SIZE(e)+SIZE(f)]), g);
  1792. T<<buf;
  1793. return T;
  1794. }
  1795. T7(TA, TB, TC, TD, TE, TF, TG) File& File::getMulti(TA &a, TB &b, TC &c, TD &d, TE &e, TF &f, TG &g)
  1796. {
  1797. C Int size=SIZE(a)+SIZE(b)+SIZE(c)+SIZE(d)+SIZE(e)+SIZE(f)+SIZE(g);
  1798. Byte buf[size]; T>>buf;
  1799. Unaligned(a, (TA&)(buf[0]));
  1800. Unaligned(b, (TB&)(buf[SIZE(a)]));
  1801. Unaligned(c, (TC&)(buf[SIZE(a)+SIZE(b)]));
  1802. Unaligned(d, (TD&)(buf[SIZE(a)+SIZE(b)+SIZE(c)]));
  1803. Unaligned(e, (TE&)(buf[SIZE(a)+SIZE(b)+SIZE(c)+SIZE(d)]));
  1804. Unaligned(f, (TF&)(buf[SIZE(a)+SIZE(b)+SIZE(c)+SIZE(d)+SIZE(e)]));
  1805. Unaligned(g, (TG&)(buf[SIZE(a)+SIZE(b)+SIZE(c)+SIZE(d)+SIZE(e)+SIZE(f)]));
  1806. return T;
  1807. }
  1808. T8(TA, TB, TC, TD, TE, TF, TG, TH) File& File::putMulti(C TA &a, C TB &b, C TC &c, C TD &d, C TE &e, C TF &f, C TG &g, C TH &h)
  1809. {
  1810. C Int size=SIZE(a)+SIZE(b)+SIZE(c)+SIZE(d)+SIZE(e)+SIZE(f)+SIZE(g)+SIZE(h);
  1811. Byte buf[size];
  1812. Unaligned((TA&)(buf[0]), a);
  1813. Unaligned((TB&)(buf[SIZE(a)]), b);
  1814. Unaligned((TC&)(buf[SIZE(a)+SIZE(b)]), c);
  1815. Unaligned((TD&)(buf[SIZE(a)+SIZE(b)+SIZE(c)]), d);
  1816. Unaligned((TE&)(buf[SIZE(a)+SIZE(b)+SIZE(c)+SIZE(d)]), e);
  1817. Unaligned((TF&)(buf[SIZE(a)+SIZE(b)+SIZE(c)+SIZE(d)+SIZE(e)]), f);
  1818. Unaligned((TG&)(buf[SIZE(a)+SIZE(b)+SIZE(c)+SIZE(d)+SIZE(e)+SIZE(f)]), g);
  1819. Unaligned((TH&)(buf[SIZE(a)+SIZE(b)+SIZE(c)+SIZE(d)+SIZE(e)+SIZE(f)+SIZE(g)]), h);
  1820. T<<buf;
  1821. return T;
  1822. }
  1823. T8(TA, TB, TC, TD, TE, TF, TG, TH) File& File::getMulti(TA &a, TB &b, TC &c, TD &d, TE &e, TF &f, TG &g, TH &h)
  1824. {
  1825. C Int size=SIZE(a)+SIZE(b)+SIZE(c)+SIZE(d)+SIZE(e)+SIZE(f)+SIZE(g)+SIZE(h);
  1826. Byte buf[size]; T>>buf;
  1827. Unaligned(a, (TA&)(buf[0]));
  1828. Unaligned(b, (TB&)(buf[SIZE(a)]));
  1829. Unaligned(c, (TC&)(buf[SIZE(a)+SIZE(b)]));
  1830. Unaligned(d, (TD&)(buf[SIZE(a)+SIZE(b)+SIZE(c)]));
  1831. Unaligned(e, (TE&)(buf[SIZE(a)+SIZE(b)+SIZE(c)+SIZE(d)]));
  1832. Unaligned(f, (TF&)(buf[SIZE(a)+SIZE(b)+SIZE(c)+SIZE(d)+SIZE(e)]));
  1833. Unaligned(g, (TG&)(buf[SIZE(a)+SIZE(b)+SIZE(c)+SIZE(d)+SIZE(e)+SIZE(f)]));
  1834. Unaligned(h, (TH&)(buf[SIZE(a)+SIZE(b)+SIZE(c)+SIZE(d)+SIZE(e)+SIZE(f)+SIZE(g)]));
  1835. return T;
  1836. }
  1837. T9(TA, TB, TC, TD, TE, TF, TG, TH, TI) File& File::putMulti(C TA &a, C TB &b, C TC &c, C TD &d, C TE &e, C TF &f, C TG &g, C TH &h, C TI &i)
  1838. {
  1839. C Int size=SIZE(a)+SIZE(b)+SIZE(c)+SIZE(d)+SIZE(e)+SIZE(f)+SIZE(g)+SIZE(h)+SIZE(i);
  1840. Byte buf[size];
  1841. Unaligned((TA&)(buf[0]), a);
  1842. Unaligned((TB&)(buf[SIZE(a)]), b);
  1843. Unaligned((TC&)(buf[SIZE(a)+SIZE(b)]), c);
  1844. Unaligned((TD&)(buf[SIZE(a)+SIZE(b)+SIZE(c)]), d);
  1845. Unaligned((TE&)(buf[SIZE(a)+SIZE(b)+SIZE(c)+SIZE(d)]), e);
  1846. Unaligned((TF&)(buf[SIZE(a)+SIZE(b)+SIZE(c)+SIZE(d)+SIZE(e)]), f);
  1847. Unaligned((TG&)(buf[SIZE(a)+SIZE(b)+SIZE(c)+SIZE(d)+SIZE(e)+SIZE(f)]), g);
  1848. Unaligned((TH&)(buf[SIZE(a)+SIZE(b)+SIZE(c)+SIZE(d)+SIZE(e)+SIZE(f)+SIZE(g)]), h);
  1849. Unaligned((TI&)(buf[SIZE(a)+SIZE(b)+SIZE(c)+SIZE(d)+SIZE(e)+SIZE(f)+SIZE(g)+SIZE(h)]), i);
  1850. T<<buf;
  1851. return T;
  1852. }
  1853. T9(TA, TB, TC, TD, TE, TF, TG, TH, TI) File& File::getMulti(TA &a, TB &b, TC &c, TD &d, TE &e, TF &f, TG &g, TH &h, TI &i)
  1854. {
  1855. C Int size=SIZE(a)+SIZE(b)+SIZE(c)+SIZE(d)+SIZE(e)+SIZE(f)+SIZE(g)+SIZE(h)+SIZE(i);
  1856. Byte buf[size]; T>>buf;
  1857. Unaligned(a, (TA&)(buf[0]));
  1858. Unaligned(b, (TB&)(buf[SIZE(a)]));
  1859. Unaligned(c, (TC&)(buf[SIZE(a)+SIZE(b)]));
  1860. Unaligned(d, (TD&)(buf[SIZE(a)+SIZE(b)+SIZE(c)]));
  1861. Unaligned(e, (TE&)(buf[SIZE(a)+SIZE(b)+SIZE(c)+SIZE(d)]));
  1862. Unaligned(f, (TF&)(buf[SIZE(a)+SIZE(b)+SIZE(c)+SIZE(d)+SIZE(e)]));
  1863. Unaligned(g, (TG&)(buf[SIZE(a)+SIZE(b)+SIZE(c)+SIZE(d)+SIZE(e)+SIZE(f)]));
  1864. Unaligned(h, (TH&)(buf[SIZE(a)+SIZE(b)+SIZE(c)+SIZE(d)+SIZE(e)+SIZE(f)+SIZE(g)]));
  1865. Unaligned(i, (TI&)(buf[SIZE(a)+SIZE(b)+SIZE(c)+SIZE(d)+SIZE(e)+SIZE(f)+SIZE(g)+SIZE(h)]));
  1866. return T;
  1867. }
  1868. #endif
  1869. /******************************************************************************/