00001
00024 #ifndef INC_RVC_LIST_H
00025 #define INC_RVC_LIST_H
00026
00027 #ifndef INC_RVC_OBJECT_H
00028 #include <rvc/object.h>
00029 #endif
00030
00031 #ifndef INC_MI32_DOUBLEAR_H
00032 #include <mi32/doublear.h>
00033 #endif
00034
00035 namespace RVC {
00036
00037 #ifndef GENERATING_DOXYGEN_OUTPUT
00038
00039 struct GENLISTINFO;
00040 class LISTHANDLE;
00041 #endif
00042
00043
00049 class LIST : public RVC::OBJECT {
00050 public:
00051
00053 LIST (
00054 );
00055
00057 LIST (
00058 const RVC::LIST& obj
00059 );
00060
00062 virtual ~LIST (
00063 );
00064
00066 RVC::LIST& operator= (
00067 const RVC::LIST& rhs
00068 );
00069
00072 INT32 GetItemSize (
00073 INT32 ItemNum
00074 ) const;
00075
00078 INT32 GetMaxItemSize (
00079 ) const;
00080
00083 INT32 GetNumItems (
00084 ) const;
00085
00087 ERRVALUE InsertItems (
00088 INT32 StartPosn,
00089 INT32 NumItems = 1
00090 );
00091
00093 ERRVALUE Make (
00094 const RVC::OBJECT& parent,
00095 const RVC::DESCRIPTOR& Descriptor,
00096 const CREDENTIALS* Credentials RVC_DEFAULT_CREDENTIALS
00097 );
00098
00100 ERRVALUE Make (
00101 RVC::OBJITEM& ObjItem,
00102 #ifdef RVC_CREDENTIALS_MANDATORY
00103 const char* Source,
00104 const CREDENTIALS* Credentials
00105 #else
00106 const char* Source = 0,
00107 const CREDENTIALS* Credentials = 0
00108 #endif
00109 );
00110
00113 INT32 Read (
00114 INT32 ItemNum,
00115 void *ptr
00116 ) const;
00117
00120 INT32 Read (
00121 INT32 ItemNum,
00122 MIDOUBLEARRAY& ptr
00123 ) const;
00124
00127 INT32 Read (
00128 INT32 ItemNum,
00129 void **buffer,
00130 INT32 BufferSize
00131 ) const;
00132
00134 template <class _CT>
00135 ERRVALUE Read (
00136 INT32 ItemNum,
00137 SIMPLE_ARRAY<_CT>& data
00138 ) const {
00139 INT32 MaxItems = data.GetMaxItems();
00140 _CT* buffer = data.Detach();
00141 INT32 NumBytes = Read(ItemNum, reinterpret_cast<void**>(&buffer), MaxItems * sizeof(_CT));
00142 if (NumBytes < 0) {
00143 data.Attach(buffer, MaxItems);
00144 data.Clear();
00145 }
00146 else {
00147 if (static_cast<UINT32>(NumBytes) > MaxItems * sizeof(_CT)) MaxItems = NumBytes / sizeof(_CT);
00148 data.Attach(buffer, MaxItems);
00149 data.Resize(NumBytes / sizeof(_CT), true, false);
00150 NumBytes = 0;
00151 }
00152 return (NumBytes);
00153 }
00154
00156 template <class _CT>
00157 ERRVALUE Read (
00158 INT32 ItemNum,
00159 DOUBLE_ARRAY<_CT>& data
00160 ) const {
00161 INT32 MaxItems = data.GetMaxItems();
00162 MIDOUBLEARRAY items;
00163 data.Detach(items);
00164 INT32 NumBytes = Read(ItemNum, items);
00165 if (NumBytes < 0) {
00166 data.Attach(items, MaxItems);
00167 data.Clear();
00168 }
00169 else {
00170 if (static_cast<UINT32>(NumBytes) > MaxItems * sizeof(_CT)) MaxItems = NumBytes / sizeof(_CT);
00171 data.Attach(items, MaxItems);
00172 data.Resize(NumBytes / sizeof(_CT), true, false);
00173 NumBytes = 0;
00174 }
00175 return (NumBytes);
00176 }
00177
00180 INT32 Read (
00181 INT32 ItemNum,
00182 INT32 StartPosn,
00183 INT32 Length,
00184 void *ptr
00185 ) const;
00186
00188 template <class _CT>
00189 ERRVALUE Read (
00190 INT32 ItemNum,
00191 INT32 StartPosn,
00192 INT32 Length,
00193 SIMPLE_ARRAY<_CT>& data
00194 ) const {
00195 INT32 NumBytes = Read(ItemNum, StartPosn * sizeof(_CT), Length * sizeof(_CT), static_cast<void*>(data));
00196 if (NumBytes >= 0) {
00197 data.Resize(NumBytes / sizeof(_CT), true, false);
00198 NumBytes = 0;
00199 }
00200 return (NumBytes);
00201 }
00202
00204 ERRVALUE Resize (
00205 INT32 NewNumItems
00206 );
00207
00209 ERRVALUE ResizeItem (
00210 INT32 ItemNum,
00211 INT32 NewItemSize
00212 );
00213
00215 ERRVALUE SwapItems (
00216 INT32 Item1,
00217 INT32 Item2
00218 );
00219
00222 INT32 Write (
00223 INT32 ItemNum,
00224 INT32 Length,
00225 const void* ptr
00226 );
00227
00230 INT32 Write (
00231 INT32 ItemNum,
00232 INT32 TotalSize,
00233 INT32 StartPosn,
00234 INT32 Length,
00235 const void* ptr
00236 );
00237
00239 template <class _CT>
00240 ERRVALUE Write (
00241 INT32 ItemNum,
00242 const SIMPLE_ARRAY<_CT>& data
00243 ) {
00244 ERRVALUE err = Write(ItemNum, data.GetNumItems() * sizeof(_CT), data);
00245 if (err > 0) err = 0;
00246 return (err);
00247 }
00248
00250 template <class _CT>
00251 ERRVALUE Write (
00252 INT32 ItemNum,
00253 const DOUBLE_ARRAY<_CT>& data
00254 ) {
00255 ERRVALUE err = Write(ItemNum, data.GetNumItems() * sizeof(_CT), data);
00256 if (err > 0) err = 0;
00257 return (err);
00258 }
00259
00260 protected:
00261
00263 ERRVALUE Make (const OBJECT& parent, const DESCRIPTOR& Descriptor, GENLISTINFO& newinfo, int HeaderSize, int HeaderType, const CREDENTIALS* Credentials);
00264
00266 ERRVALUE OpenObject (OPENMODE OpenFlags, GENLISTINFO& newinfo, int HeaderSize, int HeaderType, MDLGPARENT parent, const CREDENTIALS* Credentials);
00267
00268 private:
00269 #ifndef GENERATING_DOXYGEN_OUTPUT
00270
00272 virtual ERRVALUE v_CloseObject ();
00273 virtual OBJTYPE v_GetDftObjectType () const;
00274 virtual bool v_IsObjectOpen () const;
00275 virtual ERRVALUE v_OpenObject (OPENMODE OpenFlags, MDLGPARENT parent, const CREDENTIALS* Credentials);
00276
00277 LISTHANDLE* m_ListHandle;
00278 #endif // GENERATING_DOXYGEN_OUTPUT
00279 };
00280
00281 }
00282
00283 #endif