SCENE C++ API  2.1.0
lsattribute.h
1 #pragma once
2 
3 #include <core_api/lsglobaldefinitions.h>
4 #include <core_api/iso_iec_988_1999.h>
5 #include <core_api/lsinterface.h>
6 #include <core_api/lsstring.h>
7 #include <core_api/lspod.h>
8 
9 #include <Eigen/Core>
10 
11 #include <vector>
12 #include <set>
13 #include <map>
14 
15 namespace SCENE_API {
16 
17 // Forward declarations
18 class LSAttribute_Implementation;
19 
74 class LSAttribute : public LSInterface
75 {
76 public:
77 
80  CORE_API_EXPORT LSAttribute();
81 
84  CORE_API_EXPORT virtual ~LSAttribute();
85 
89  CORE_API_EXPORT LSAttribute(const LSAttribute& attribute);
90 
95  template<class T>
96  LSAttribute(const T& value);
97 
101  CORE_API_EXPORT bool isValid() const;
102 
111  template<class T>
112  T getValue() const;
113 
119  template<class T>
120  void setValue(const T& value);
121 
125  CORE_API_EXPORT LSString toString() const;
126 
131  CORE_API_EXPORT bool fromString(LSString value);
132 
136  CORE_API_EXPORT LSString getType() const;
137 
142  CORE_API_EXPORT bool hasType(LSString type) const;
143 
148  template<class T>
149  bool hasType() const;
150 
155  CORE_API_EXPORT LSAttribute& operator=(const LSAttribute& from);
156 
160  CORE_API_EXPORT void* operator new(size_t tSize);
161 
165  CORE_API_EXPORT void operator delete(void* p);
166 
167 protected:
168  template<class T> void createFrom(const T& value);
169 
170 protected:
171  LS_INTERFACE(LSAttribute, LSInterface)
172 };
173 
174 //-----------------------------------------------------------------------------
175 #define DECLARE_LSATTRIBUTE_TYPE(T) \
176  template<> CORE_API_EXPORT LSAttribute::LSAttribute(const T& value); \
177  template<> CORE_API_EXPORT T LSAttribute::getValue<T>() const; \
178  template<> CORE_API_EXPORT void LSAttribute::setValue<T>(const T& value); \
179  template<> CORE_API_EXPORT bool LSAttribute::hasType<T>() const;
180 
181 //-----------------------------------------------------------------------------
182 #define DECLARE_LSATTRIBUTE_POD_TYPE(T) \
183  DECLARE_LSATTRIBUTE_TYPE(LSPod<T>) \
184  template<> CORE_API_EXPORT void LSAttribute::createFrom<LSPod<T> >(const LSPod<T>& value); \
185  template<> inline LSAttribute::LSAttribute(const T& value) : LSInterface(0) \
186  { createFrom(LSPod<T>(value)); } \
187  template<> inline T LSAttribute::getValue<T>() const \
188  { return LSAttribute::getValue<LSPod<T> >().get(); } \
189  template<> inline void LSAttribute::setValue<T>(const T& value) \
190  { LSAttribute::setValue<LSPod<T> >(value); } \
191  template<> inline bool LSAttribute::hasType<T>() const \
192  { return LSAttribute::hasType<LSPod<T> >(); }
193 
194 // Valid attribute types
195 typedef std::map<const LSString, LSString> StringMap;
196 
197 DECLARE_LSATTRIBUTE_TYPE(int8_t)
198 DECLARE_LSATTRIBUTE_POD_TYPE(std::vector<int8_t>)
199 DECLARE_LSATTRIBUTE_TYPE(uint8_t)
200 DECLARE_LSATTRIBUTE_POD_TYPE(std::vector<uint8_t>)
201 DECLARE_LSATTRIBUTE_TYPE(int16_t)
202 DECLARE_LSATTRIBUTE_POD_TYPE(std::vector<int16_t>)
203 DECLARE_LSATTRIBUTE_TYPE(uint16_t)
204 DECLARE_LSATTRIBUTE_POD_TYPE(std::vector<uint16_t>)
205 DECLARE_LSATTRIBUTE_TYPE(int32_t)
206 DECLARE_LSATTRIBUTE_POD_TYPE(std::vector<int32_t>)
207 DECLARE_LSATTRIBUTE_TYPE(uint32_t)
208 DECLARE_LSATTRIBUTE_POD_TYPE(std::vector<uint32_t>)
209 DECLARE_LSATTRIBUTE_TYPE(int64_t)
210 DECLARE_LSATTRIBUTE_POD_TYPE(std::vector<int64_t>)
211 DECLARE_LSATTRIBUTE_TYPE(uint64_t)
212 DECLARE_LSATTRIBUTE_POD_TYPE(std::vector<uint64_t>)
213 DECLARE_LSATTRIBUTE_TYPE(double)
214 DECLARE_LSATTRIBUTE_POD_TYPE(std::vector<double>)
215 DECLARE_LSATTRIBUTE_TYPE(bool)
216 DECLARE_LSATTRIBUTE_TYPE(LSString)
217 DECLARE_LSATTRIBUTE_POD_TYPE(std::vector<LSString>)
218 DECLARE_LSATTRIBUTE_POD_TYPE(std::set<LSString>)
219 DECLARE_LSATTRIBUTE_POD_TYPE(StringMap)
220 DECLARE_LSATTRIBUTE_TYPE(Eigen::Vector2d)
221 DECLARE_LSATTRIBUTE_POD_TYPE(std::vector<Eigen::Vector2d>)
222 DECLARE_LSATTRIBUTE_TYPE(Eigen::Vector2f)
223 DECLARE_LSATTRIBUTE_POD_TYPE(std::vector<Eigen::Vector2f>)
224 DECLARE_LSATTRIBUTE_TYPE(Eigen::Vector2i)
225 DECLARE_LSATTRIBUTE_POD_TYPE(std::vector<Eigen::Vector2i>)
226 DECLARE_LSATTRIBUTE_TYPE(Eigen::Vector2ui)
227 DECLARE_LSATTRIBUTE_POD_TYPE(std::vector<Eigen::Vector2us>)
228 DECLARE_LSATTRIBUTE_TYPE(Eigen::Vector3d)
229 DECLARE_LSATTRIBUTE_POD_TYPE(std::vector<Eigen::Vector3d>)
230 DECLARE_LSATTRIBUTE_POD_TYPE(std::vector<std::vector<Eigen::Vector3d> >)
231 DECLARE_LSATTRIBUTE_TYPE(Eigen::Vector3f)
232 DECLARE_LSATTRIBUTE_POD_TYPE(std::vector<Eigen::Vector3f>)
233 DECLARE_LSATTRIBUTE_TYPE(Eigen::Vector3us)
234 DECLARE_LSATTRIBUTE_POD_TYPE(std::vector<Eigen::Vector3ui>)
235 DECLARE_LSATTRIBUTE_TYPE(Eigen::Vector4d)
236 DECLARE_LSATTRIBUTE_POD_TYPE(std::vector<Eigen::Vector4d>)
237 DECLARE_LSATTRIBUTE_TYPE(Eigen::Vector4f)
238 DECLARE_LSATTRIBUTE_TYPE(Eigen::Matrix4d)
239 DECLARE_LSATTRIBUTE_POD_TYPE(std::vector<Eigen::Matrix4d>)
240 DECLARE_LSATTRIBUTE_TYPE(Eigen::Matrix4f)
241 
242 }