

#ifndef Sfcc_CimData_h
#define Sfcc_CimData_h

#include "cimcdt.h"
#include "cimcft.h"

#include "CimString.h"
#include "sfccPtr.h"

class CimcObjectPath;
typedef class sfccPtr<CimcObjectPath, cimcObjectPath> CimObjectPath;
class CimcInstance;
typedef class sfccPtr<CimcInstance, cimcInstance> CimInstance;
class CimcDateTime;
typedef class sfccPtr<CimcDateTime, cimcDateTime> CimDateTime;
class CimcArray;
typedef class sfccPtr<CimcArray, cimcArray> CimArray;

class CimData {
  friend class CimcObjectPath; 
  friend class CimcInstance; 
  friend class CimcIterator;
  friend class CimcClass; 
  friend class CimcDateTime; 
  friend class CimcArrayIdx; 
  friend class CimcArray; 
  
  protected:
   cimcData _data;
   union _cimc {
      CimString *string;      
      CimInstance *inst;      
      CimObjectPath *ref;
      CimDateTime *dateTime;
      CimArray *array;
   } cim;
   CimData(cimcData data);
   
   cimcData getEnc();
   cimcValue* getValue();
   cimcType getType();
  public:
  ~CimData();
   CimData();
   CimData(cimcSint8 d);
   CimData(cimcSint16 d);
   CimData(cimcSint32 d);
   CimData(cimcSint64 d);
   CimData(cimcUint8 d);
   CimData(cimcUint16 d);
   CimData(cimcUint32 d);
   CimData(cimcUint64 d);
   CimData(cimcReal32 d);
   CimData(cimcReal64 d);
   CimData(const CimString& d);
   CimData(const char* d);
   CimData(const CimObjectPath& d);
   CimData(const CimDateTime& d);
   CimData(const CimArray& d);
   operator CimString() const;
   operator const char* () const;
   operator CimDateTime() const;
   operator cimcSint8() const;
   operator cimcSint16() const;
   operator cimcSint32() const;
   operator cimcSint64() const;
   operator unsigned char() const;
   operator unsigned short() const;
   operator cimcUint32() const;
   operator cimcUint64() const;
   operator cimcReal32() const;
   operator cimcReal64() const;
   operator CimArray() const;
   operator CimInstance() const;
   operator CimObjectPath() const;
   int isNullValue() const;
   int isNotFound() const;
};

#endif



