libalvalue
1.12
|
00001 00010 #pragma once 00011 #ifndef _LIBALVALUE_ALVALUE_ALVALUE_H_ 00012 #define _LIBALVALUE_ALVALUE_ALVALUE_H_ 00013 00014 # include <cstdio> 00015 # include <string> 00016 # include <vector> 00017 00018 # include <alvalue/config.h> 00019 00020 namespace AL 00021 { 00022 00027 #ifndef ALVALUE_VERBOSITY 00028 # define ALVALUE_VERBOSITY 00029 00033 typedef enum ALVALUE_API _TVerbosity { 00034 VerbosityNone=0, 00035 VerbosityMini, 00036 VerbosityMedium, 00037 VerbosityFull 00038 } Verbosity; 00039 #endif 00040 00049 class ALVALUE_API ALValue 00050 { 00051 friend void ConvertALValueToSoapXml(const ALValue *pAlValue, 00052 std::string &strToFill, 00053 bool bInAnArray); 00054 friend class ALNetwork; 00055 00056 public: 00061 typedef int TALValueInt; 00066 typedef float TALValueFloat; 00071 typedef double TALValueDouble; 00076 typedef bool TALValueBool; 00081 typedef std::string TALValueString; 00082 00087 typedef std::vector<unsigned char> TAlValueBinaryData; 00092 typedef TAlValueBinaryData::iterator ITAlValueBinaryData; 00097 typedef TAlValueBinaryData::const_iterator CITAlValueBinaryData; 00098 00103 typedef std::vector<ALValue> TAlValueArray; 00108 typedef TAlValueArray::iterator ITAlValueArray; 00113 typedef TAlValueArray::const_iterator CITAlValueArray; 00114 00119 union unionValue { 00120 TAlValueArray *asArray; 00121 TALValueBool asBool; 00122 TALValueInt asInt; 00123 TALValueFloat asFloat; 00124 TALValueString *asString; 00125 TAlValueBinaryData *asObject; 00126 TAlValueBinaryData *asBinary; 00127 }; 00128 00129 public: 00142 enum Type { 00143 TypeInvalid = 0, 00144 TypeArray, 00145 TypeBool, 00146 TypeInt, 00147 TypeFloat, 00148 TypeString, 00149 TypeObject, 00150 TypeBinary 00151 }; 00152 00153 public: 00155 ALValue(); 00160 ALValue(const bool &value); 00165 ALValue(const int &value); 00170 ALValue(const double &value); 00175 ALValue(const float &value); 00180 ALValue(const std::string &value); 00185 ALValue(const char *value); 00186 00191 ALValue(const std::vector<std::string> &pListString); 00196 ALValue(const std::vector<float> &pListFloat); 00201 ALValue(const std::vector<int> &pListInt); 00202 00208 ALValue(const void *value, int nBytes); 00214 ALValue(const char **pArrayOfString, int nNbrString); 00220 ALValue(const float *pFloat, int nNbrElement); 00226 ALValue(const int *pInt, int nNbrElement); 00227 00232 ALValue(const TAlValueBinaryData &rhs); 00237 ALValue(ALValue const &rhs); 00238 00240 virtual ~ALValue(); 00241 00243 void clear(); 00244 00251 ALValue& operator=(const ALValue &rhs); 00253 ALValue& operator=(const bool &rhs); 00255 ALValue& operator=(const int &rhs); 00257 ALValue& operator=(const double &rhs); 00259 ALValue& operator=(const float &rhs); 00261 ALValue& operator=(const char *rhs); 00263 ALValue& operator=(const TAlValueBinaryData &rhs); 00264 00270 bool operator==(ALValue const &other) const; 00276 bool operator!=(ALValue const &other) const; 00277 00285 operator bool&(); 00293 operator const bool() const; 00301 operator int&(); 00309 operator const int() const; 00317 operator float&(); 00325 operator const float() const; 00326 00334 operator const double() const; 00335 00343 operator std::string&(); 00351 operator const std::string&() const; 00352 00360 operator TAlValueBinaryData&(); 00368 operator const TAlValueBinaryData&() const; 00376 operator const void*() const; 00377 00382 typedef std::vector<std::string> TStringArray; 00387 typedef std::vector<float> TFloatArray; 00392 typedef std::vector<int> TIntArray; 00393 00401 operator TStringArray() const; 00409 operator TFloatArray() const; 00417 operator TIntArray() const; 00418 00425 ALValue& setObject(const void* pData, int nDataSizeInBytes); 00426 00432 void SetBinary(const void *rhs, int nDataSizeInBytes); 00439 ALValue& SetBinaryNoCopy(const void *rhs, int nDataSizeInBytes); 00440 00445 const void* GetBinary() const; 00450 const void* getObject() const; 00451 00456 float *getPtrValue(); 00457 00467 void ToStringArray(TStringArray &pArrayToFill, 00468 bool bInsertDefaultOnError = false) const; 00478 void ToFloatArray(TFloatArray &pArrayToFill, 00479 bool bInsertDefaultOnError = false) const; 00489 void ToIntArray(TIntArray &pArrayToFill, 00490 bool bInsertDefaultOnError = false) const; 00491 00492 00499 ALValue& operator[](int i); 00500 00507 const ALValue& operator[](int i) const; 00508 00513 enum Type getType() const; 00514 00519 bool isValid () const; 00524 bool isArray () const; 00529 bool isBool () const; 00534 bool isInt () const; 00539 bool isFloat () const; 00544 bool isString() const; 00549 bool isObject() const; 00554 bool isBinary() const; 00555 00556 00562 unsigned int getSize() const; 00563 00564 00574 void arrayReserve(int size); 00575 00581 void arraySetSize(int size); 00582 00592 void arrayPush(const ALValue &pSrcToCopyNotOwned); 00593 00604 std::string toString(Verbosity pnVerbosity = VerbosityMini) const; 00605 00615 std::string toPythonBuffer() const; 00616 00626 bool decodeB64(const char *pszB64); 00627 00637 bool decodeB64Object(const char *pszB64); 00638 00643 void encodeB64(std::string &strOutput) const; 00644 00657 static enum Type deduceType(const char *szInput, 00658 int nLimitToLen = 0x7FFFFFFF); 00659 00668 void unSerializeFromText(const char *szInput, 00669 int nLimitToLen = 0x7FFFFFFF); 00670 00676 std::string serializeToText(void) const; 00677 00683 static bool xUnSerializeFromText_InnerTest(void); 00684 00685 template <typename T0> 00686 static ALValue array(const T0 &a0); 00687 template <typename T0, typename T1> 00688 static ALValue array(const T0 &a0, const T1 &a1); 00689 template <typename T0, typename T1, typename T2> 00690 static ALValue array(const T0 &a0, const T1 &a1, const T2 &a2); 00691 template <typename T0, typename T1, typename T2, typename T3> 00692 static ALValue array(const T0 &a0, const T1 &a1, const T2 &a2, const T3 &a3); 00693 template <typename T0, typename T1, typename T2, typename T3, typename T4> 00694 static ALValue array(const T0 &a0, const T1 &a1, const T2 &a2, const T3 &a3, const T4 &a4); 00695 template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5> 00696 static ALValue array(const T0 &a0, const T1 &a1, const T2 &a2, const T3 &a3, const T4 &a4, const T5 &a5); 00697 template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6> 00698 static ALValue array(const T0 &a0, const T1 &a1, const T2 &a2, const T3 &a3, const T4 &a4, const T5 &a5, const T6 &a6); 00699 template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7> 00700 static ALValue array(const T0 &a0, const T1 &a1, const T2 &a2, const T3 &a3, const T4 &a4, const T5 &a5, const T6 &a6, const T7 &a7); 00701 template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8> 00702 static ALValue array(const T0 &a0, const T1 &a1, const T2 &a2, const T3 &a3, const T4 &a4, const T5 &a5, const T6 &a6, const T7 &a7, const T8 &a8); 00703 template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9> 00704 static ALValue array(const T0 &a0, const T1 &a1, const T2 &a2, const T3 &a3, const T4 &a4, const T5 &a5, const T6 &a6, const T7 &a7, const T8 &a8, const T9 &a9); 00705 00706 protected: 00708 void xInvalidate(); 00709 void xAssertCompatibleType(enum Type pnWantedType); 00710 void xAssertType(enum Type pnWantedType) const; 00711 void xAssertArraySize(int pnSize) const; 00716 void assertStruct(); 00720 int _type; 00722 union unionValue _value; 00723 00724 public: 00729 const unionValue getUnionValue(); 00730 00735 TAlValueArray *getArrayPtr() const; 00736 00742 static std::string TypeToString(enum Type pnType); 00743 00744 }; 00745 00746 template <typename T0> 00747 ALValue ALValue::array(const T0 &a0) 00748 { 00749 ALValue result; 00750 result.arraySetSize(1); 00751 result[0] = a0; 00752 return result; 00753 } 00754 00755 template <typename T0, typename T1> 00756 ALValue ALValue::array(const T0 &a0, const T1 &a1) 00757 { 00758 ALValue result; 00759 result.arraySetSize(2); 00760 result[0] = a0; 00761 result[1] = a1; 00762 return result; 00763 } 00764 00765 template <typename T0, typename T1, typename T2> 00766 ALValue ALValue::array(const T0 &a0, const T1 &a1, const T2 &a2) 00767 { 00768 ALValue result; 00769 result.arraySetSize(3); 00770 result[0] = a0; 00771 result[1] = a1; 00772 result[2] = a2; 00773 return result; 00774 } 00775 00776 template <typename T0, typename T1, typename T2, typename T3> 00777 ALValue ALValue::array(const T0 &a0, const T1 &a1, const T2 &a2, const T3 &a3) 00778 { 00779 ALValue result; 00780 result.arraySetSize(4); 00781 result[0] = a0; 00782 result[1] = a1; 00783 result[2] = a2; 00784 result[3] = a3; 00785 return result; 00786 } 00787 00788 template <typename T0, typename T1, typename T2, typename T3, typename T4> 00789 ALValue ALValue::array(const T0 &a0, const T1 &a1, const T2 &a2, const T3 &a3, const T4 &a4) 00790 { 00791 ALValue result; 00792 result.arraySetSize(5); 00793 result[0] = a0; 00794 result[1] = a1; 00795 result[2] = a2; 00796 result[3] = a3; 00797 result[4] = a4; 00798 return result; 00799 } 00800 00801 template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5> 00802 ALValue ALValue::array(const T0 &a0, const T1 &a1, const T2 &a2, const T3 &a3, const T4 &a4, const T5 &a5) 00803 { 00804 ALValue result; 00805 result.arraySetSize(6); 00806 result[0] = a0; 00807 result[1] = a1; 00808 result[2] = a2; 00809 result[3] = a3; 00810 result[4] = a4; 00811 result[5] = a5; 00812 return result; 00813 } 00814 00815 template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6> 00816 ALValue ALValue::array(const T0 &a0, const T1 &a1, const T2 &a2, const T3 &a3, const T4 &a4, const T5 &a5, const T6 &a6) 00817 { 00818 ALValue result; 00819 result.arraySetSize(7); 00820 result[0] = a0; 00821 result[1] = a1; 00822 result[2] = a2; 00823 result[3] = a3; 00824 result[4] = a4; 00825 result[5] = a5; 00826 result[6] = a6; 00827 return result; 00828 } 00829 00830 template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7> 00831 ALValue ALValue::array(const T0 &a0, const T1 &a1, const T2 &a2, const T3 &a3, const T4 &a4, const T5 &a5, const T6 &a6, const T7 &a7) 00832 { 00833 ALValue result; 00834 result.arraySetSize(8); 00835 result[0] = a0; 00836 result[1] = a1; 00837 result[2] = a2; 00838 result[3] = a3; 00839 result[4] = a4; 00840 result[5] = a5; 00841 result[6] = a6; 00842 result[7] = a7; 00843 return result; 00844 } 00845 00846 template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8> 00847 ALValue ALValue::array(const T0 &a0, const T1 &a1, const T2 &a2, const T3 &a3, const T4 &a4, const T5 &a5, const T6 &a6, const T7 &a7, const T8 &a8) 00848 { 00849 ALValue result; 00850 result.arraySetSize(9); 00851 result[0] = a0; 00852 result[1] = a1; 00853 result[2] = a2; 00854 result[3] = a3; 00855 result[4] = a4; 00856 result[5] = a5; 00857 result[6] = a6; 00858 result[7] = a7; 00859 result[8] = a8; 00860 return result; 00861 } 00862 00863 template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9> 00864 ALValue ALValue::array(const T0 &a0, const T1 &a1, const T2 &a2, const T3 &a3, const T4 &a4, const T5 &a5, const T6 &a6, const T7 &a7, const T8 &a8, const T9 &a9) 00865 { 00866 ALValue result; 00867 result.arraySetSize(10); 00868 result[0] = a0; 00869 result[1] = a1; 00870 result[2] = a2; 00871 result[3] = a3; 00872 result[4] = a4; 00873 result[5] = a5; 00874 result[6] = a6; 00875 result[7] = a7; 00876 result[8] = a8; 00877 result[9] = a9; 00878 return result; 00879 } 00880 } // namespace AL 00881 00887 std::ostream &operator<<(std::ostream &os, const AL::ALValue &a); 00888 00889 #endif // _LIBALVALUE_ALVALUE_ALVALUE_H_