00001 00032 #ifndef LLSDTRAITS_H 00033 #define LLSDTRAITS_H 00034 00035 #include "llsd.h" 00036 #include "llstring.h" 00037 00038 template<class T> 00039 class LLSDTraits 00040 { 00041 protected: 00042 typedef T (LLSD::*Getter)() const; 00043 00044 LLSD::Type type; 00045 Getter getter; 00046 00047 public: 00048 LLSDTraits(); 00049 00050 T get(const LLSD& actual) 00051 { 00052 return (actual.*getter)(); 00053 } 00054 00055 bool checkType(const LLSD& actual) 00056 { 00057 return actual.type() == type; 00058 } 00059 }; 00060 00061 template<> inline 00062 LLSDTraits<LLSD::Boolean>::LLSDTraits() 00063 : type(LLSD::TypeBoolean), getter(&LLSD::asBoolean) 00064 { } 00065 00066 template<> inline 00067 LLSDTraits<LLSD::Integer>::LLSDTraits() 00068 : type(LLSD::TypeInteger), getter(&LLSD::asInteger) 00069 { } 00070 00071 template<> inline 00072 LLSDTraits<LLSD::Real>::LLSDTraits() 00073 : type(LLSD::TypeReal), getter(&LLSD::asReal) 00074 { } 00075 00076 template<> inline 00077 LLSDTraits<LLSD::UUID>::LLSDTraits() 00078 : type(LLSD::TypeUUID), getter(&LLSD::asUUID) 00079 { } 00080 00081 template<> inline 00082 LLSDTraits<LLSD::String>::LLSDTraits() 00083 : type(LLSD::TypeString), getter(&LLSD::asString) 00084 { } 00085 00086 template<> 00087 class LLSDTraits<LLString> : public LLSDTraits<LLSD::String> 00088 { }; 00089 00090 template<> 00091 class LLSDTraits<const char*> : public LLSDTraits<LLSD::String> 00092 { }; 00093 00094 template<> inline 00095 LLSDTraits<LLSD::Date>::LLSDTraits() 00096 : type(LLSD::TypeDate), getter(&LLSD::asDate) 00097 { } 00098 00099 template<> inline 00100 LLSDTraits<LLSD::URI>::LLSDTraits() 00101 : type(LLSD::TypeURI), getter(&LLSD::asURI) 00102 { } 00103 00104 template<> inline 00105 LLSDTraits<LLSD::Binary>::LLSDTraits() 00106 : type(LLSD::TypeBinary), getter(&LLSD::asBinary) 00107 { } 00108 00109 #endif // LLSDTRAITS_H