4 #include "AttributeModifier.h"
11 template<
typename T>
bool CoreConvertString2Array(
const kstl::string &stringValue, T*
const arrayValue, u32 arrayNbElements)
13 kstl::string::size_type posToParse = stringValue.find(
'{', 0);
14 bool hasBraces = (posToParse == 0);
15 if (hasBraces) posToParse++;
16 for (u32 i = 0; i<arrayNbElements; i++)
18 if (!hasBraces) posToParse = 0;
20 if (posToParse >= stringValue.size())
return false;
23 kstl::string::size_type nextPosToParse = 0;
24 nextPosToParse = stringValue.find(
',', posToParse);
26 if (nextPosToParse == kstl::string::npos)
28 nextPosToParse = stringValue.find(
'}', posToParse);
31 if (nextPosToParse == kstl::string::npos)
33 nextPosToParse = stringValue.size();
35 kstl::string stringToConvert;
36 stringToConvert.assign(stringValue, posToParse, nextPosToParse - posToParse);
37 if (!CoreConvertString2Value<T>(stringToConvert, arrayValue[i]))
return false;
38 posToParse = nextPosToParse + 1;
43 template<
typename T>
bool CoreConvertArray2String(kstl::string& stringValue,
const T* arrayValue, u32 arrayNbElements)
48 for (u32 i = 0; i<arrayNbElements; i++)
50 if (i != 0) stringValue +=
",";
52 if (!CoreConvertValue2String<T>(value, arrayValue[i]))
return false;
62 template<
typename T>
void CoreCopyArray(T*
const destArray,
const T* srcArray, u32 arrayNbElements)
64 memcpy(destArray, srcArray, arrayNbElements *
sizeof(T));
69 inline void CoreCopyArray<kstl::string>(kstl::string*
const destArray,
const kstl::string* srcArray, u32 arrayNbElements)
71 for (u32 i = 0; i<arrayNbElements; i++) destArray[i] = srcArray[i];
74 template<
typename Tdest,
typename Tsrc>
75 void CoreCopyCastArray(Tdest*
const destArray,
const Tsrc* srcArray, u32 arrayNbElements)
77 for (u32 elem = 0; elem<arrayNbElements; elem++)
78 destArray[elem] = (Tdest)srcArray[elem];
84 inline void CoreCopyCastArray<bool, kfloat>(
bool*
const destArray,
const kfloat* srcArray, u32 arrayNbElements)
86 for (u32 elem = 0; elem<arrayNbElements; elem++)
87 destArray[elem] = (srcArray[elem] != (kfloat)0);
92 inline void CoreCopyCastArray<bool, s32>(
bool*
const destArray,
const s32* srcArray, u32 arrayNbElements)
94 for (u32 elem = 0; elem<arrayNbElements; elem++)
95 destArray[elem] = (srcArray[elem] != (s32)0);
100 inline void CoreCopyCastArray<kfloat, bool>(kfloat*
const destArray,
const bool* srcArray, u32 arrayNbElements)
102 for (u32 elem = 0; elem<arrayNbElements; elem++)
103 destArray[elem] = (kfloat)(srcArray[elem] ? 1 : 0);
108 inline void CoreCopyCastArray<s32, bool>(s32*
const destArray,
const bool* srcArray, u32 arrayNbElements)
110 for (u32 elem = 0; elem<arrayNbElements; elem++)
111 destArray[elem] = (s32)(srcArray[elem] ? 1 : 0);
141 template<s32 notificationLevel,
typename T, CoreModifiable::ATTRIBUTE_TYPE attributeElementType, u32 nbLines, u32 nbColumns>
class maArrayHeritage :
public CoreModifiableAttributeData<std::array<T, nbLines*nbColumns>>
143 template<s32 notiflevel>
147 using ArrayType = std::array<T, nbLines*nbColumns>;
155 : CoreModifiableAttributeData<ArrayType>(owner, isInitAttribute, ID)
157 setArrayValue(vals, nbLines*nbColumns);
161 : CoreModifiableAttributeData<ArrayType>(owner, isInitAttribute, ID)
163 KIGS_ASSERT(nbColumns >= 2);
164 this->at(0, 0) = val0;
165 this->at(0, 1) = val1;
168 : CoreModifiableAttributeData<ArrayType>(owner, isInitAttribute, ID)
170 KIGS_ASSERT(nbColumns >= 3);
171 this->at(0, 0) = val0;
172 this->at(0, 1) = val1;
173 this->at(0, 2) = val2;
176 : CoreModifiableAttributeData<ArrayType>(owner, isInitAttribute, ID)
178 KIGS_ASSERT(nbColumns >= 4);
179 this->at(0, 0) = val0;
180 this->at(0, 1) = val1;
181 this->at(0, 2) = val2;
182 this->at(0, 3) = val3;
188 if (CoreModifiableAttributeData<ArrayType>::CopyAttribute(attribute))
return true;
189 if ((attribute.getNbArrayElements() == getNbArrayElements()) && (attribute.getArrayElementType() == getArrayElementType()))
191 attribute.getArrayValue(getArrayBuffer(), getNbArrayElements());
199 T& operator[](u32 index) {
return this->getElement(0, index); }
200 const T& operator[](u32 index)
const {
return this->getConstElement(0, index); }
202 u32 getNbElements()
const {
return this->getNbArrayElements(); }
204 T* getVector() {
return mValue.data(); }
205 const T* getConstVector()
const {
return mValue.data(); }
208 const T& at(
size_t line,
size_t column)
const {
return mValue[line*nbColumns + column]; }
209 T& at(
size_t line,
size_t column) {
return mValue[line*nbColumns + column]; }
211 virtual u32 getNbArrayElements()
const override {
return nbLines*nbColumns; }
212 virtual u32 getNbArrayColumns()
const override {
return nbColumns; }
213 virtual u32 getNbArrayLines()
const override {
return nbLines; }
216 T* getArrayBuffer() {
return mValue.data(); }
217 T* getArray() {
return mValue.data(); }
220 const T* getConstArrayBuffer()
const {
return mValue.data(); }
221 const T* getConstArray()
const {
return mValue.data(); }
223 T& getElement(u32 line, u32 column) {
return at(line, column); }
224 const T& getConstElement(u32 line, u32 column)
const {
return at(line, column); }
232 virtual CoreModifiable::ATTRIBUTE_TYPE getArrayElementType()
const override {
return attributeElementType; }
234 void broadcastValue(
const T &v)
236 for (
auto& el : mValue)
242 virtual s32 size()
const override {
return nbLines*nbColumns; };
244 virtual bool getValue(
void*& value)
const override { value = (
void*)mValue.data();
return true; }
246 virtual bool getValue(
bool& value)
const override { value = (s32)at(0, 0) != 0;
return true; }
247 virtual bool getValue(s8& value)
const override { value = (s8)at(0, 0);
return true; }
248 virtual bool getValue(s16& value)
const override { value = (s16)at(0, 0);
return true; }
249 virtual bool getValue(s32& value)
const override { value = (s32)at(0, 0);
return true; }
250 virtual bool getValue(s64& value)
const override { value = (s64)at(0, 0);
return true; }
251 virtual bool getValue(u8& value)
const override { value = (u8)at(0, 0);
return true; }
252 virtual bool getValue(u16& value)
const override { value = (u16)at(0, 0);
return true; }
253 virtual bool getValue(u32& value)
const override { value = (u32)at(0, 0);
return true; }
254 virtual bool getValue(u64& value)
const override { value = (u64)at(0, 0);
return true; }
255 virtual bool getValue(kfloat& value)
const override { value = (kfloat)at(0, 0);
return true; }
256 virtual bool getValue(kdouble& value)
const override { value = (kdouble)at(0, 0);
return true; }
258 virtual bool getValue(kstl::string& value)
const override {
return CoreConvertArray2String<T>(value, getConstArrayBuffer(), getNbArrayElements()); }
260 virtual bool getValue(Point2D& value)
const override { value.x = (kfloat)at(0, 0); value.y = (kfloat)at(0, 1);
return true; }
261 virtual bool getValue(Point3D& value)
const override { value.x = (kfloat)at(0, 0); value.y = (kfloat)at(0, 1); value.z = (kfloat)at(0, 2);
return true; }
262 virtual bool getValue(Vector4D& value)
const override { value.x = (kfloat)at(0, 0); value.y = (kfloat)at(0, 1); value.z = (kfloat)at(0, 2); value.w = (kfloat)at(0, 3);
return true; }
264 using CoreModifiableAttributeData<ArrayType>::setValue;
266 bool setValue(
const Point2D& pt)
override
268 if (nbColumns < 2)
return false;
271 DO_NOTIFICATION(notificationLevel);
274 bool setValue(
const Point3D& pt)
override
276 if (nbColumns < 3)
return false;
280 DO_NOTIFICATION(notificationLevel);
283 bool setValue(
const Vector4D& pt)
override
285 if (nbColumns < 4)
return false;
290 DO_NOTIFICATION(notificationLevel);
293 bool setValue(Point2DI pt)
295 if (nbColumns < 2)
return false;
298 DO_NOTIFICATION(notificationLevel);
301 bool setValue(Point3DI pt)
303 if (nbColumns < 3)
return false;
307 DO_NOTIFICATION(notificationLevel);
313 auto& operator=(Point2D pt) {
314 if (nbColumns < 2)
return *
this;
319 auto& operator=(Point3D pt)
321 if (nbColumns < 3)
return *
this;
328 auto& operator=(Vector4D pt) {
329 if (nbColumns < 4)
return *
this;
337 auto& operator=(Point2DI pt) { setValue(pt);
return *
this; }
338 auto& operator=(Point3DI pt) { setValue(pt);
return *
this; }
342 #define DECLARE_SET_VALUE_BROADCAST(type) virtual bool setValue(type value) override { if (isReadOnly()) { return false; } this->broadcastValue((T)value); DO_NOTIFICATION(notificationLevel); return true; }
344 EXPAND_MACRO_FOR_BASE_TYPES(NOQUALIFIER, NOQUALIFIER, DECLARE_SET_VALUE_BROADCAST);
346 #undef DECLARE_SET_VALUE_BROADCAST
348 virtual bool setValue(
const char* value)
override { kstl::string localstr(value);
return setValue(localstr); }
349 virtual bool setValue(
const kstl::string& value)
override
352 if (CoreConvertString2Array<T>(value, getArrayBuffer(), getNbArrayElements()))
354 DO_NOTIFICATION(notificationLevel);
360 virtual operator Point2DI()
const
362 Point2DI tmpValue(0, 0);
363 if ((nbLines == 1) && (nbColumns >= 2))
365 tmpValue.x = (s32)this->at(0, 0);
366 tmpValue.y = (s32)this->at(0, 1);
371 virtual operator Point3DI()
const
373 Point3DI tmpValue(0, 0, 0);
374 if ((nbLines == 1) && (nbColumns >= 3))
376 tmpValue.x = (s32)this->at(0, 0);
377 tmpValue.y = (s32)this->at(0, 1);
378 tmpValue.z = (s32)this->at(0, 2);
383 virtual operator Point2D()
const
385 Point2D tmpValue(0.0f, 0.0f);
386 if ((nbLines == 1) && (nbColumns >= 2))
388 tmpValue.x = (float)this->at(0, 0);
389 tmpValue.y = (float)this->at(0, 1);
394 virtual operator Point3D()
const
396 Point3D tmpValue(0.0f, 0.0f, 0.0f);
397 if ((nbLines == 1) && (nbColumns >= 3))
399 tmpValue.x = (float)this->at(0, 0);
400 tmpValue.y = (float)this->at(0, 1);
401 tmpValue.z = (float)this->at(0, 2);
406 virtual operator Vector4D()
const
408 Vector4D tmpValue(0.0f, 0.0f, 0.0f, 0.0f);
409 if ((nbLines == 1) && (nbColumns >= 4))
411 tmpValue.x = (float)this->at(0, 0);
412 tmpValue.y = (float)this->at(0, 1);
413 tmpValue.z = (float)this->at(0, 2);
414 tmpValue.w = (float)this->at(0, 3);
420 #define DECLARE_SETARRAYVALUE( b ) virtual bool setArrayValue(const b *value, u32 nbElements ) override {if(isReadOnly()){ return false; }\
421 if(nbElements>getNbArrayElements()){ return false;} \
422 CoreCopyCastArray<T,b>(getArrayBuffer(), value, nbElements); \
423 DO_NOTIFICATION(notificationLevel);\
426 EXPAND_MACRO_FOR_BASE_TYPES(NOQUALIFIER, NOQUALIFIER, DECLARE_SETARRAYVALUE);
429 #define DECLARE_SETARRAYELEMENTVALUE( b ) virtual bool setArrayElementValue(b value, u32 line, u32 column ) override {if(isReadOnly()){ return false; }\
430 if(line>=nbLines || column>=nbColumns){ return false;} \
431 at(line,column)=(T)value; \
432 DO_NOTIFICATION(notificationLevel); \
435 EXPAND_MACRO_FOR_NUMERIC_TYPES(NOQUALIFIER, NOQUALIFIER, DECLARE_SETARRAYELEMENTVALUE);
438 #undef DECLARE_SETARRAYVALUE
439 #undef DECLARE_SETARRAYELEMENTVALUE
441 virtual bool setArrayElementValue(
bool value, u32 line, u32 column)
override
444 if (line >= nbLines || column >= nbColumns) {
return false; }
445 at(line,column) = (T)(value ? 1 : 0);
446 DO_NOTIFICATION(notificationLevel);;
450 virtual bool setArrayElementValue(
const kstl::string &value, u32 line, u32 column)
override
453 if (line >= nbLines || column >= nbColumns)
return false;
454 if (CoreConvertString2Value<T>(value, this->at(line,column)))
456 DO_NOTIFICATION(notificationLevel);
466 #define DECLARE_GETARRAYVALUE( b ) virtual bool getArrayValue(b * const value, u32 nbElements ) const override {if(nbElements>getNbArrayElements()){ return false;} \
467 CoreCopyCastArray<b,T>(value,getConstArrayBuffer(),nbElements); return true;}
470 EXPAND_MACRO_FOR_BASE_TYPES(NOQUALIFIER, NOQUALIFIER, DECLARE_GETARRAYVALUE);
473 #undef DECLARE_GETARRAYVALUE
476 #define DECLARE_GETARRAYELEMENTVALUE( b ) virtual bool getArrayElementValue(b& value, u32 line, u32 column ) const override { if(line>=nbLines || column>=nbColumns){ return false;} \
477 value=(b)at(line,column); return true;}
479 EXPAND_MACRO_FOR_NUMERIC_TYPES(NOQUALIFIER, NOQUALIFIER, DECLARE_GETARRAYELEMENTVALUE);
482 #undef DECLARE_GETARRAYELEMENTVALUE
484 virtual bool getArrayElementValue(
bool& value, u32 line, u32 column)
const override
486 if (line >= nbLines || column >= nbColumns)
return false;
487 value = (at(line, column) != (T)0);
491 virtual bool getArrayElementValue(kstl::string& value, u32 line, u32 column)
const override
493 if (line >= nbLines || column >= nbColumns)
return false;
494 return CoreConvertValue2String<T>(value, at(line, column));
663 template<
typename element_type, CoreModifiable::ATTRIBUTE_TYPE attribute_type, s32 nbElements>