12#ifndef TT_INCLUDE_DATASAFE_H
13#define TT_INCLUDE_DATASAFE_H
14#include "SysTimeClass.h"
15#if (PARAM_EDITING_ON) || (DDBEDIT) || (W3DVIEWER)
17#define safe_unsigned_int unsigned int
19#define safe_unsigned_long unsigned long
20#define safe_float float
21#define safe_double double
23#define safe_int SafeDataClass<int>
24#define safe_unsigned_int SafeDataClass<unsigned int>
25#define safe_long SafeDataClass<int>
26#define safe_unsigned_long SafeDataClass<unsigned int>
27#define safe_float SafeDataClass<float>
28#define safe_double SafeDataClass<double>
29#define MAX_ENTRIES_PER_LIST 16
30#define MAX_DATASAFE_LISTS 8192
31#define MAX_DATASAFE_TYPES 128
32#define MAX_OBJECT_COPIES 8
33#define DATASAFE_TIME_CHECK_CALLS 100000
34#define TICKS_PER_SECOND 1000
35#define SECURITY_CHECK_TIME (TICKS_PER_SECOND * 15)
36#define SENTINEL_ONE 0x29874362
37#define SENTINEL_TWO 0x0bad0bad
38template <
typename T,
int size>
class RefArray
41 char _dummy[size *
sizeof(T)];
47 operator const T* ()
const
55 const T* operator & ()
const
60class DataSafeHandleClass
63 DataSafeHandleClass(
int val = 0)
65 Handle.Whole.WholeHandle = val;
67 bool Is_Valid(
void)
const
69 return Handle.Whole.WholeHandle != -1;
71 inline int operator =(
const int &val)
73 Handle.Whole.WholeHandle = val;
76 inline operator int(
void)
78 return Handle.Whole.WholeHandle;
80 inline operator int(
void)
const
82 return Handle.Whole.WholeHandle;
84 inline int &operator() (
void)
86 return Handle.Whole.WholeHandle;
105class DataSafeEntryClass
108 DataSafeHandleClass Handle;
109 DataSafeEntryClass *Next;
110 DataSafeEntryClass *Prev;
116class DataSafeEntryDataClass :
public DataSafeEntryClass
123class DataSafeEntryListClass
126 DataSafeEntryListClass(
void)
132 memset(HandleIDUsage, 0,
sizeof(HandleIDUsage));
134 DataSafeEntryClass *SafeList;
138 char HandleIDUsage[MAX_ENTRIES_PER_LIST];
141class DataSafeEntryTypeClass
144 DataSafeEntryTypeClass(
void)
150 unsigned long TypeCode;
155class GenericDataSafeClass
158 GenericDataSafeClass(
void);
159 SCRIPTS_API
static DataSafeEntryClass *Get_Entry(DataSafeHandleClass handle);
160 SCRIPTS_API
static int Get_Entry_Type(DataSafeHandleClass handle);
161 SCRIPTS_API
static void Reset_Timers(
void);
162 SCRIPTS_API
static void Dump_Safe_Stats(
char *dump_buffer,
int buffer_size);
163 SCRIPTS_API
static void Print_Safe_Stats_To_Debug_Output(
void);
164 SCRIPTS_API
static void Reset(
void);
165 static void Set_Preferred_Thread(
unsigned int thread_id) {PreferredThread = thread_id;};
167 SCRIPTS_API
void Shutdown(
void);
168 SCRIPTS_API
static DataSafeEntryClass *Get_Entry_By_Index(
int list,
int index);
169 SCRIPTS_API
static void Shuffle(
bool forced =
false);
170 SCRIPTS_API
static void Swap_Entries(DataSafeEntryClass *first, DataSafeEntryClass *second,
int type);
171 SCRIPTS_API
static void Encrypt(
void *data,
int size,
unsigned long key = SimpleKey,
bool do_checksum =
true);
172 SCRIPTS_API
static void Decrypt(
void *data,
int size,
unsigned long key = SimpleKey,
bool do_checksum =
true);
173 SCRIPTS_API
static void Mem_Copy_Encrypt(
void *dest,
void *src,
int size,
bool do_checksum);
174 SCRIPTS_API
static void Mem_Copy_Decrypt(
void *dest,
void *src,
int size,
bool do_checksum);
175 static __forceinline
void Security_Check(
void);
176 static __forceinline
void Security_Fault(
void);
177 SCRIPTS_API
static void Say_Security_Fault(
void);
178 SCRIPTS_API
static int Get_Random_List_For_Insertion(
int type);
179 SCRIPTS_API
static void Random_Insertion(DataSafeEntryClass *entry,
int list,
int type,
bool is_slop =
false);
180 SCRIPTS_API
static int Create_Safe_List(
int type);
181 SCRIPTS_API
static int Get_Handle_ID(
int list);
182 SCRIPTS_API
static void Remove_From_List(
int list, DataSafeEntryClass *entry_ptr);
183 SCRIPTS_API
static void Free_Handle_ID(
int list,
int id);
184 static inline int Get_Type_Size(
int type);
185 SCRIPTS_API
static REF_DECL(
unsigned int, PreferredThread);
186 SCRIPTS_API
static REF_DECL(
unsigned long, SimpleKey);
187 SCRIPTS_API
static REF_DECL(
unsigned long, HandleKey);
188 SCRIPTS_API
static REF_DECL(
int, NumLists);
189 SCRIPTS_API
static REF_DECL(TT_NOOP(RefArray<DataSafeEntryListClass *, MAX_DATASAFE_LISTS>), Safe);
190 SCRIPTS_API
static REF_DECL(
unsigned long, Checksum);
191 SCRIPTS_API
static REF_DECL(
unsigned long, ShuffleDelay);
192 SCRIPTS_API
static REF_DECL(
unsigned long, SecurityCheckDelay);
193 SCRIPTS_API
static REF_DECL(TT_NOOP(RefArray<DataSafeEntryTypeClass, MAX_DATASAFE_TYPES>), TypeList);
194 SCRIPTS_API
static REF_DECL(
int, TypeListCount);
195 SCRIPTS_API
static REF_DECL(DataSafeHandleClass, SentinelOne);
196 SCRIPTS_API
static REF_DECL(DataSafeHandleClass, SentinelTwo);
197 SCRIPTS_API
static REF_DECL(
int, CRCErrors);
201class DataSafeClass :
public GenericDataSafeClass
204 DataSafeClass(T *bogus_ptr = NULL,
int slopcount = 3);
205 ~DataSafeClass(
void);
206 static bool Get(DataSafeHandleClass handle, T* &item);
207 static inline bool In_Return_List(T *ptr)
211 void *temp = (
void*)ptr;
212 if (temp >= &(ReturnList[0][0]) && temp < &(ReturnList[MAX_OBJECT_COPIES][0])) {
213 if (((
unsigned long) temp - (
unsigned long)(&(ReturnList[0][0]))) %
sizeof(T) == 0)
221 static bool Set(DataSafeHandleClass handle, T *data);
222 static DataSafeHandleClass Add_Entry(T &value,
bool is_slop =
false);
223 static void Delete_Entry(DataSafeHandleClass handle);
225 static int Get_Type_ID(
unsigned long type_code,
int size);
226 static unsigned long Get_Type_Code(
void);
227 SCRIPTS_API
static REF_DECL(
int, Type);
228 SCRIPTS_API
static REF_DECL(
int, MinSlop);
229 SCRIPTS_API
static REF_DECL(TT_NOOP(RefArray<RefArray<
char,
sizeof(T)>, MAX_OBJECT_COPIES>), ReturnList);
230 SCRIPTS_API
static REF_DECL(
int, ReturnIndex);
233extern char ErrorVal[1024];
239 SafeDataClass(T data);
240 ~SafeDataClass(
void);
241 SafeDataClass(SafeDataClass &)
245 inline T* Get_Ptr(
void)
const;
246 inline bool Commit(T* data_ptr)
const;
247 inline T &operator() (
void)
const;
248 inline T &operator = (T
const &data);
249 inline T &operator = (SafeDataClass<T> &safedata);
250 inline operator T()
const;
251 inline bool operator == (T
const &data);
252 inline bool operator == (SafeDataClass<T> &safedata);
253 inline bool operator != (T
const &data);
254 inline bool operator != (SafeDataClass<T> &safedata);
255 inline bool operator > (T
const &data);
256 inline bool operator > (SafeDataClass<T> &safedata);
257 inline bool operator >= (T
const &data);
258 inline bool operator >= (SafeDataClass<T> &safedata);
259 inline bool operator < (T
const &data);
260 inline bool operator < (SafeDataClass<T> &safedata);
261 inline bool operator <= (T
const &data);
262 inline bool operator <= (SafeDataClass<T> &safedata);
263 inline T &operator + (T
const &data);
264 inline T &operator + (SafeDataClass<T> &safedata);
265 inline T &operator += (T
const &data);
266 inline T &operator += (SafeDataClass<T> &safedata);
267 inline T &operator - (T
const &data);
268 inline T &operator - (SafeDataClass<T> &safedata);
269 inline T &operator -= (T
const &data);
270 inline T &operator -= (SafeDataClass<T> &safedata);
271 inline T &operator * (T
const &data);
272 inline T &operator * (SafeDataClass<T> &safedata);
273 inline T &operator *= (T
const &data);
274 inline T &operator *= (SafeDataClass<T> &safedata);
275 inline T &operator / (T
const &data);
276 inline T &operator / (SafeDataClass<T> &safedata);
277 inline T &operator /= (T
const &data);
278 inline T &operator /= (SafeDataClass<T> &safedata);
279 inline T &operator ++ (
void);
280 inline T &operator -- (
void);
281 inline T &operator ++ (
int);
282 inline T &operator -- (
int);
283 DataSafeHandleClass Get_Handle(
void)
290 DataSafeHandleClass Handle;
293inline int GenericDataSafeClass::Get_Type_Size(
int type)
295 return TypeList[type].Size;
298__forceinline
void GenericDataSafeClass::Security_Fault(
void)
301 Say_Security_Fault();
304__forceinline
void GenericDataSafeClass::Security_Check(
void)
306 static bool _checking =
false;
307 static unsigned long _calls = 0;
309 if (_calls < DATASAFE_TIME_CHECK_CALLS)
314 if (HandleKey - SimpleKey == HandleKey)
318 if (SimpleKey - HandleKey == SimpleKey)
322 unsigned long time = TIMEGETTIME();
323 if (time < SecurityCheckDelay || (time | SecurityCheckDelay) == 0 || (time - SecurityCheckDelay) > SECURITY_CHECK_TIME)
328 SecurityCheckDelay = time;
329 unsigned long checkey = ~SimpleKey;
330 for (
int i=0 ; i<NumLists ; i++)
332 if (Safe[i] != NULL && Safe[i]->EntryCount > 0)
334 DataSafeEntryClass *entry_ptr = Safe[i]->SafeList;
335 unsigned long *data = NULL;
336 int data_size = entry_ptr->Size;
337 data_size = data_size >> 2;
340 for (
int j=0 ; j<Safe[i]->EntryCount ; j++)
342 checkey ^= entry_ptr->Handle;
343 data = (
unsigned long *) (((
char*)entry_ptr) +
sizeof(*entry_ptr));
344 for (
int z=0 ; z<data_size ; z++)
348 entry_ptr = entry_ptr->Next;
353 if (checkey != Checksum)
360 if ((
int)SentinelOne != 0)
362 bool got = DataSafeClass<int>::Get(SentinelOne, val);
363 if (!got || val == NULL || *val != SENTINEL_ONE)
369 if ((
int)SentinelTwo != 0)
371 bool got = DataSafeClass<int>::Get(SentinelTwo, val);
372 if (!got || val == NULL || *val != SENTINEL_TWO)
384DataSafeClass<T>::DataSafeClass(T*,
int slopcount)
386 memset(ReturnList, 0, MAX_OBJECT_COPIES *
sizeof(T));
388 int data_size =
sizeof(T);
389 int type_code = Get_Type_Code();
390 int id = Get_Type_ID(type_code, data_size);
393 for (
int i=0 ; i<slopcount ; i++)
395#pragma warning(suppress: 6255)
396#pragma warning(suppress: 6263)
397 void *stackmem = _alloca(
sizeof(T));
398 T *slop_ptr =
new (stackmem) T;
399 Add_Entry(*slop_ptr,
true);
404DataSafeClass<T>::~DataSafeClass(
void)
406 for (
int i=0 ; i<NumLists ; i++)
408 if (Safe[i] != NULL && Safe[i]->EntryType == Type && Safe[i]->EntryCount > 0)
410 while (Safe[i]->EntryCount > 0)
412 int entries = Safe[i]->EntryCount;
413 DataSafeHandleClass handle = Safe[i]->SafeList->Handle ^ SimpleKey;
414 handle = handle ^ HandleKey;
415 Delete_Entry(handle);
416 if (entries != Safe[i]->EntryCount+1)
427unsigned long DataSafeClass<T>::Get_Type_Code(
void)
430 return (
unsigned long)&dummy;
434int DataSafeClass<T>::Get_Type_ID(
unsigned long type_code,
int size)
437 for (
int i=0 ; i<TypeListCount ; i++)
439 if (TypeList[i].TypeCode == type_code)
441 return(TypeList[i].ID);
444 if (TypeListCount < MAX_DATASAFE_TYPES)
446 TypeList[TypeListCount].TypeCode = type_code;
447 TypeList[TypeListCount].ID = TypeListCount;
448 TypeList[TypeListCount].Size = size;
449 id = TypeListCount++;
455DataSafeHandleClass DataSafeClass<T>::Add_Entry(T &value,
bool is_slop)
458 DataSafeEntryClass *entry_ptr = (DataSafeEntryClass*) (
new char [
sizeof(DataSafeEntryDataClass<T>)]);
461 entry_ptr->Next = NULL;
462 entry_ptr->Prev = NULL;
463 entry_ptr->Size =
sizeof(value);
464 entry_ptr->IsSlop = is_slop;
465 DataSafeEntryDataClass<T>* data_ptr = (DataSafeEntryDataClass<T>*) entry_ptr;
466 Mem_Copy_Encrypt(& data_ptr->Data, &value,
sizeof(value),
true);
467 int list = Get_Random_List_For_Insertion(Type);
468 if (list != -1 && Safe[list] != NULL)
470 int index = Get_Handle_ID(list);
471 DataSafeHandleClass handle;
472 handle.Handle.Part.List = (
unsigned short)list;
473 handle.Handle.Part.ID = (
unsigned char)index;
474 handle.Handle.Part.Type = (
unsigned char)Type;
475 DataSafeHandleClass encrypted_handle = handle ^ SimpleKey;
476 Checksum = Checksum ^ encrypted_handle;
477 entry_ptr->Handle = encrypted_handle;
478 Random_Insertion(entry_ptr, list, Type, is_slop);
479 if (Safe[list]->EntryCount == 1 && !is_slop)
481 for (
int i=0 ; i<MinSlop ; i++)
483 entry_ptr = (DataSafeEntryClass*) (
new char [
sizeof(DataSafeEntryDataClass<T>)]);
486 entry_ptr->Next = NULL;
487 entry_ptr->Prev = NULL;
488 entry_ptr->Size =
sizeof(T);
489 entry_ptr->IsSlop =
true;
490 Encrypt(&((DataSafeEntryDataClass<T>*)entry_ptr)->Data,
sizeof(T), SimpleKey,
true);
491 DataSafeHandleClass slop_handle;
492 slop_handle.Handle.Part.ID = (
unsigned char)Get_Handle_ID(list);
493 slop_handle.Handle.Part.List = (
unsigned short)list;
494 slop_handle.Handle.Part.Type = (
unsigned char)Type;
495 DataSafeHandleClass encrypted_slop_handle = slop_handle ^ SimpleKey;
496 Checksum = Checksum ^ encrypted_slop_handle;
497 entry_ptr->Handle = encrypted_slop_handle;
498 Random_Insertion(entry_ptr, list, Type,
true);
502 if (Safe[list]->SlopCount != 0 && Safe[list]->EntryCount > Safe[list]->SlopCount * 2 && !is_slop)
504 entry_ptr = Safe[list]->SafeList;
505 DataSafeHandleClass removal_list[MAX_ENTRIES_PER_LIST];
506 int removal_count = 0;
509 for (
int j=0 ; j<Safe[list]->EntryCount ; j++)
511 if (entry_ptr->IsSlop)
513 DataSafeHandleClass decode_handle = entry_ptr->Handle ^ SimpleKey;
514 decode_handle = decode_handle ^ HandleKey;
515 removal_list[removal_count++] = decode_handle;
517 entry_ptr = entry_ptr->Next;
520 for (
int j=0 ; j<removal_count ; j++)
522 Delete_Entry(removal_list[j]);
525 handle.Handle.Whole.WholeHandle ^= HandleKey;
529 return (DataSafeHandleClass)-1;
533void DataSafeClass<T>::Delete_Entry(DataSafeHandleClass handle)
538 DataSafeHandleClass new_handle = handle ^ HandleKey;
539 list = new_handle.Handle.Part.List;
540 id = new_handle.Handle.Part.ID;
541 DataSafeEntryClass *entry_ptr = Get_Entry(handle);
542 if (entry_ptr != NULL)
544 DataSafeHandleClass match_handle = new_handle ^ SimpleKey;
545 Checksum ^= match_handle;
546 DataSafeEntryDataClass<T> *whole_entry_ptr = (DataSafeEntryDataClass<T>*) entry_ptr;
547 Decrypt(&whole_entry_ptr->Data, Get_Type_Size(Safe[list]->EntryType), SimpleKey);
548 if (!whole_entry_ptr->IsSlop)
550 whole_entry_ptr->Data.T::~T();
552 Remove_From_List(list, entry_ptr);
553 Free_Handle_ID(list,
id);
554 delete [] (
void*) entry_ptr;
560bool DataSafeClass<T>::Get(DataSafeHandleClass handle, T* &item)
562 DataSafeEntryClass *entry_ptr = Get_Entry(handle);
563 if (entry_ptr == NULL)
567 DataSafeEntryDataClass<T> *data_entry_ptr = (DataSafeEntryDataClass<T>*) entry_ptr;
568 Mem_Copy_Decrypt(&(ReturnList[ReturnIndex][0]), &data_entry_ptr->Data,
sizeof(T),
false);
569 item = (T*)(&(ReturnList[ReturnIndex][0]));
571 if (ReturnIndex >= MAX_OBJECT_COPIES)
581bool DataSafeClass<T>::Set(DataSafeHandleClass handle, T *data)
583 DataSafeEntryClass *entry_ptr = Get_Entry(handle);
584 if (entry_ptr == NULL)
588 DataSafeEntryDataClass<T> *data_entry_ptr = (DataSafeEntryDataClass<T>*) entry_ptr;
589 Decrypt(&data_entry_ptr->Data,
sizeof(T), SimpleKey,
true);
590 Mem_Copy_Encrypt(&data_entry_ptr->Data, data,
sizeof(T),
true);
597inline SafeDataClass<T>::SafeDataClass(T data)
599 Handle = DataSafeClass<T>::Add_Entry(data);
603SafeDataClass<T>::SafeDataClass(
void)
605#pragma warning(suppress: 6255)
606 void *stackmem = _alloca(
sizeof(T));
607#pragma warning(suppress: 28193)
608 T *data =
new (stackmem) T;
609#pragma warning(suppress: 6011)
610 Handle = DataSafeClass<T>::Add_Entry(*data);
614inline SafeDataClass<T>::~SafeDataClass(
void)
616 if (Handle.Is_Valid())
618 DataSafeClass<T>::Delete_Entry(Handle);
623inline T &SafeDataClass<T>::operator = (T
const &data)
625 if (Handle.Is_Valid())
627 DataSafeClass<T>::Set(Handle, (T*) &data);
633inline T &SafeDataClass<T>::operator = (SafeDataClass<T> &safedata)
635 T *other_value = NULL;
636 if (Handle.Is_Valid())
638 other_value = safedata.Get_Ptr();
641 DataSafeClass<T>::Set(Handle, (T*) other_value);
645 return (T&)*other_value;
648#pragma warning(suppress: 6011)
649 return (T&)*other_value;
653inline bool SafeDataClass<T>::operator == (T
const &data)
656 if (Handle.Is_Valid())
658 DataSafeClass<T>::Get(Handle, data_ptr);
661 return(*data_ptr == data);
668inline bool SafeDataClass<T>::operator == (SafeDataClass<T> &safedata)
671 T *other_value = NULL;
672 if (Handle.Is_Valid())
674 DataSafeClass<T>::Get(Handle, data_ptr);
677 other_value = safedata.Get_Ptr();
680 return *data_ptr == *other_value;
688inline bool SafeDataClass<T>::operator != (T
const &data)
691 if (Handle.Is_Valid())
693 DataSafeClass<T>::Get(Handle, data_ptr);
696 return *data_ptr != data;
703inline bool SafeDataClass<T>::operator != (SafeDataClass<T> &safedata)
706 T *other_value = NULL;
707 if (Handle.Is_Valid())
709 DataSafeClass<T>::Get(Handle, data_ptr);
712 other_value = safedata.Get_Ptr();
715 return(*data_ptr != *other_value);
723inline bool SafeDataClass<T>::operator > (T
const &data)
726 if (Handle.Is_Valid())
728 DataSafeClass<T>::Get(Handle, data_ptr);
731 return *data_ptr > data;
738inline bool SafeDataClass<T>::operator > (SafeDataClass<T> &safedata)
741 T *other_value = NULL;
742 if (Handle.Is_Valid())
744 DataSafeClass<T>::Get(Handle, data_ptr);
747 other_value = safedata.Get_Ptr();
750 return *data_ptr > *other_value;
758inline bool SafeDataClass<T>::operator >= (T
const &data)
761 if (Handle.Is_Valid())
763 DataSafeClass<T>::Get(Handle, data_ptr);
766 return(*data_ptr >= data);
773inline bool SafeDataClass<T>::operator >= (SafeDataClass<T> &safedata)
776 T *other_value = NULL;
777 if (Handle.Is_Valid())
779 DataSafeClass<T>::Get(Handle, data_ptr);
782 other_value = safedata.Get_Ptr();
785 return(*data_ptr >= *other_value);
792inline bool SafeDataClass<T>::operator < (T
const &data)
795 if (Handle.Is_Valid())
797 DataSafeClass<T>::Get(Handle, data_ptr);
800 return *data_ptr < data;
806inline bool SafeDataClass<T>::operator < (SafeDataClass<T> &safedata)
809 T *other_value = NULL;
810 if (Handle.Is_Valid())
812 DataSafeClass<T>::Get(Handle, data_ptr);
815 other_value = safedata.Get_Ptr();
818 return *data_ptr < *other_value;
825inline bool SafeDataClass<T>::operator <= (T
const &data)
828 if (Handle.Is_Valid())
830 DataSafeClass<T>::Get(Handle, data_ptr);
833 return *data_ptr <= data;
839inline bool SafeDataClass<T>::operator <= (SafeDataClass<T> &safedata)
842 T *other_value = NULL;
843 if (Handle.Is_Valid())
845 DataSafeClass<T>::Get(Handle, data_ptr);
848 other_value = safedata.Get_Ptr();
851 return *data_ptr <= *other_value;
858inline T &SafeDataClass<T>::operator + (T
const &value)
861 if (Handle.Is_Valid())
863 DataSafeClass<T>::Get(Handle, data_ptr);
866 *data_ptr = *data_ptr + value;
867 return (T&)*data_ptr;
870 return (T&)ErrorVal[0];
873inline T &SafeDataClass<T>::operator + (SafeDataClass<T> &safevalue)
876 T *other_value = NULL;
877 if (Handle.Is_Valid())
879 DataSafeClass<T>::Get(Handle, data_ptr);
882 other_value = safevalue.Get_Ptr();
885 *data_ptr = *data_ptr + *other_value;
886 return (T&)*data_ptr;
890 return (T&)*data_ptr;
894 return (T&)ErrorVal[0];
897inline T &SafeDataClass<T>::operator += (T
const &value)
900 if (Handle.Is_Valid())
902 DataSafeClass<T>::Get(Handle, data_ptr);
905 *data_ptr = *data_ptr + value;
906 DataSafeClass<T>::Set(Handle, data_ptr);
907 return (T&)*data_ptr;
910 return (T&)ErrorVal[0];
913inline T &SafeDataClass<T>::operator += (SafeDataClass<T> &safevalue)
916 T *other_value = NULL;
917 if (Handle.Is_Valid())
919 DataSafeClass<T>::Get(Handle, data_ptr);
922 other_value = safevalue.Get_Ptr();
925 *data_ptr = *data_ptr + *other_value;
926 DataSafeClass<T>::Set(Handle, data_ptr);
927 return (T&)*data_ptr;
931 return (T&)*data_ptr;
935 return (T&)ErrorVal[0];
938inline T &SafeDataClass<T>::operator - (T
const &value)
941 if (Handle.Is_Valid())
943 DataSafeClass<T>::Get(Handle, data_ptr);
946 *data_ptr = *data_ptr - value;
947 return (T&)*data_ptr;
950 return (T&)ErrorVal[0];
953inline T &SafeDataClass<T>::operator - (SafeDataClass<T> &safevalue)
956 T *other_value = NULL;
957 if (Handle.Is_Valid())
959 DataSafeClass<T>::Get(Handle, data_ptr);
962 other_value = safevalue.Get_Ptr();
965 *data_ptr = *data_ptr - *other_value;
966 return (T&)*data_ptr;
970 return (T&)*data_ptr;
974 return (T&)ErrorVal[0];
977inline T &SafeDataClass<T>::operator -= (T
const &value)
980 if (Handle.Is_Valid())
982 DataSafeClass<T>::Get(Handle, data_ptr);
985 *data_ptr = *data_ptr - value;
986 DataSafeClass<T>::Set(Handle, data_ptr);
987 return (T&)*data_ptr;
990 return (T&)ErrorVal[0];
993inline T &SafeDataClass<T>::operator -= (SafeDataClass<T> &safevalue)
996 T *other_value = NULL;
997 if (Handle.Is_Valid())
999 DataSafeClass<T>::Get(Handle, data_ptr);
1002 other_value = safevalue.Get_Ptr();
1005 *data_ptr = *data_ptr - *other_value;
1006 DataSafeClass<T>::Set(Handle, data_ptr);
1007 return (T&)*data_ptr;
1011 return (T&)*data_ptr;
1015 return (T&)ErrorVal[0];
1018inline T &SafeDataClass<T>::operator * (T
const &value)
1021 if (Handle.Is_Valid())
1023 DataSafeClass<T>::Get(Handle, data_ptr);
1026 *data_ptr = *data_ptr * value;
1027 return (T&)*data_ptr;
1030 return (T&)ErrorVal[0];
1033inline T &SafeDataClass<T>::operator * (SafeDataClass<T> &safevalue)
1036 T *other_value = NULL;
1037 if (Handle.Is_Valid())
1039 DataSafeClass<T>::Get(Handle, data_ptr);
1042 other_value = safevalue.Get_Ptr();
1045 *data_ptr = *data_ptr * *other_value;
1046 return (T&)*data_ptr;
1050 return (T&)*data_ptr;
1054 return (T&)ErrorVal[0];
1057inline T &SafeDataClass<T>::operator *= (T
const &value)
1060 if (Handle.Is_Valid())
1062 DataSafeClass<T>::Get(Handle, data_ptr);
1065 *data_ptr = *data_ptr * value;
1066 DataSafeClass<T>::Set(Handle, data_ptr);
1067 return (T&)*data_ptr;
1070 return (T&)ErrorVal[0];
1073inline T &SafeDataClass<T>::operator *= (SafeDataClass<T> &safevalue)
1076 T *other_value = NULL;
1077 if (Handle.Is_Valid())
1079 DataSafeClass<T>::Get(Handle, data_ptr);
1082 other_value = safevalue.Get_Ptr();
1085 *data_ptr = *data_ptr * *other_value;
1086 DataSafeClass<T>::Set(Handle, data_ptr);
1087 return (T&)*data_ptr;
1091 return (T&)*data_ptr;
1095 return (T&)ErrorVal[0];
1098inline T &SafeDataClass<T>::operator / (T
const &value)
1101 if (Handle.Is_Valid())
1103 DataSafeClass<T>::Get(Handle, data_ptr);
1106 *data_ptr = *data_ptr / value;
1107 return (T&)*data_ptr;
1110 return (T&)ErrorVal[0];
1113inline T &SafeDataClass<T>::operator / (SafeDataClass<T> &safevalue)
1116 T *other_value = NULL;
1117 if (Handle.Is_Valid())
1119 DataSafeClass<T>::Get(Handle, data_ptr);
1122 other_value = safevalue.Get_Ptr();
1125 *data_ptr = *data_ptr / *other_value;
1126 return (T&)*data_ptr;
1130 return (T&)*data_ptr;
1134 return (T&)ErrorVal[0];
1137inline T &SafeDataClass<T>::operator /= (T
const &value)
1140 if (Handle.Is_Valid())
1142 DataSafeClass<T>::Get(Handle, data_ptr);
1145 *data_ptr = *data_ptr / value;
1146 DataSafeClass<T>::Set(Handle, data_ptr);
1147 return (T&)*data_ptr;
1150 return (T&)ErrorVal[0];
1153inline T &SafeDataClass<T>::operator /= (SafeDataClass<T> &safevalue)
1156 T *other_value = NULL;
1157 if (Handle.Is_Valid())
1159 DataSafeClass<T>::Get(Handle, data_ptr);
1162 other_value = safevalue.Get_Ptr();
1165 *data_ptr = *data_ptr / *other_value;
1166 DataSafeClass<T>::Set(Handle, data_ptr);
1167 return (T&)*data_ptr;
1171 return (T&)*data_ptr;
1175 return (T&)ErrorVal[0];
1178inline T &SafeDataClass<T>::operator ++ (
void)
1181 if (Handle.Is_Valid())
1183 DataSafeClass<T>::Get(Handle, data_ptr);
1187 DataSafeClass<T>::Set(Handle, data_ptr);
1188 return (T&)*data_ptr;
1191 return (T&)ErrorVal[0];
1194inline T &SafeDataClass<T>::operator -- (
void)
1197 if (Handle.Is_Valid())
1199 DataSafeClass<T>::Get(Handle, data_ptr);
1203 DataSafeClass<T>::Set(Handle, data_ptr);
1204 return (T&)*data_ptr;
1207 return (T&)ErrorVal[0];
1210inline T &SafeDataClass<T>::operator ++ (
int)
1212 return this->operator ++ ();
1215inline T &SafeDataClass<T>::operator -- (
int)
1217 return this->operator -- ();
1220inline T &SafeDataClass<T>::operator () (
void)
const
1223 if (Handle.Is_Valid())
1225 DataSafeClass<T>::Get(Handle, data_ptr);
1235inline SafeDataClass<T>::operator T()
const
1240inline T *SafeDataClass<T>::Get_Ptr(
void)
const
1243 if (Handle.Is_Valid())
1245 DataSafeClass<T>::Get(Handle, data_ptr);
1254inline bool SafeDataClass<T>::Commit(T *data_ptr)
const
1256 if (Handle.Is_Valid())
1258 if (DataSafeClass<T>::In_Return_List(data_ptr))
1260 return DataSafeClass<T>::Set(Handle, data_ptr);