32 #if !defined(THEOLIZER_INTERNAL_VERSION_ARRAY_H) 33 #define THEOLIZER_INTERNAL_VERSION_ARRAY_H 45 #pragma warning(disable:4127) 52 #ifndef THEOLIZER_INTERNAL_DOXYGEN 71 thread_local
static unsigned mtIndent;
73 ArrayDebugBase(
unsigned)
80 template<
typename... tTypes>
81 void outputArrayDebugImpl(tTypes...)
85 template<
typename tFirst,
typename... tTypes>
86 void outputArrayDebugImpl(tFirst
const& iFirst, tTypes
const&... iTypes)
88 std::cout << std::string(ArrayDebugBase::mtIndent*2+2,
' ')
89 <<
"[" << &iFirst <<
"] " 90 << THEOLIZER_INTERNAL_TYPE_NAME(tFirst) << std::endl;
91 if (
sizeof...(tTypes))
93 return outputArrayDebugImpl(iTypes...);
97 template<
typename... tTypes>
98 unsigned outputArrayDebug(std::string
const& iTitle, tTypes
const&... iTypes)
100 std::cout << std::string(ArrayDebugBase::mtIndent*2,
' ') << iTitle << std::endl;
101 if (
sizeof...(tTypes))
103 outputArrayDebugImpl(iTypes...);
108 #define THEOLIZER_INTERNAL_DEBUG_ARRAY_BASE : public ArrayDebugBase 109 #define THEOLIZER_INTERNAL_DEBUG_ARRAY(...) ArrayDebugBase(outputArrayDebug(__VA_ARGS__)), 110 #define THEOLIZER_INTERNAL_DEBUG_ARRAY_END() (--ArrayDebugBase::mtIndent) 112 #define THEOLIZER_INTERNAL_DEBUG_ARRAY_BASE 113 #define THEOLIZER_INTERNAL_DEBUG_ARRAY(...) 114 #define THEOLIZER_INTERNAL_DEBUG_ARRAY_END() 122 template<std::size_t... tIndices>
125 typedef IndicesHolder<tIndices...,
sizeof...(tIndices)> Next;
128 template<std::
size_t tIndexCount>
131 typedef typename MakeIndices<tIndexCount-1>::Type::Next Type;
135 struct MakeIndices<0>
137 typedef IndicesHolder<> Type;
146 template<
typename tUnderlyingType>
147 struct GetTheolizerTarget
149 typedef typename tUnderlyingType::TheolizerTarget Type;
152 template<
typename tUnderlyingType>
153 struct GetTheolizerTarget< ::TheolizerNonKeepStep<tUnderlyingType, void> >
155 typedef tUnderlyingType Type;
184 template<
typename tElementType, std::
size_t tDim>
187 tElementType mElements[tDim];
190 template<
typename tArraySingleDimension, std::size_t... tIndices>
191 ArrayBody(tArraySingleDimension& iData, IndicesHolder<tIndices...>) :
192 mElements{iData[tIndices]...}
197 ArrayBody() : mElements{}
201 ArrayBody(tElementType&& iData) :
202 mElements{std::move(iData)}
217 template<
unsigned tVersionNo,
class tTheolizerVersion,
class tEnable=
void>
220 template<std::size_t... tDims>
223 static const bool kFulfil=
false;
224 static const bool kHigher=
false;
225 static const bool kLower =
false;
228 template<
unsigned tVersionNo,
class tTheolizerVersion>
229 struct Judge<tVersionNo, tTheolizerVersion, typename tTheolizerVersion::TheolizerArrayVersion >
231 template<std::size_t... tDims>
234 static const bool kFulfil=tTheolizerVersion::isFulfil(tVersionNo,
sizeof...(tDims)+1);
235 static const bool kHigher=tTheolizerVersion::isHigher(tVersionNo,
sizeof...(tDims)+1);
236 static const bool kLower =tTheolizerVersion::isLower (tVersionNo,
sizeof...(tDims)+1);
250 template<
typename tUnderlyingType, std::size_t... tDims>
257 template<
typename tUnderlyingType>
258 struct ArrayManager<tUnderlyingType>
260 template<
class tM
idSerializer,
unsigned tVersionNo>
261 struct TheolizerVersion THEOLIZER_INTERNAL_DEBUG_ARRAY_BASE
263 typedef void TheolizerArrayUnderlying;
264 typedef tUnderlyingType UnderlyingType;
269 static const bool kIsVersion=
true;
270 static const bool kIsArray=
true;
276 typedef typename GetTheolizerTarget<tUnderlyingType>::Type TheolizerTarget;
279 typedef theolizer::internal::CoveredArray<TheolizerTarget> TargetCoveredArray;
283 tUnderlyingType mElement;
288 typedef typename tUnderlyingType::AsElementOfArray AsElementOfArray;
289 AsElementOfArray& getAccess() {
return mElement.getAccess();}
290 AsElementOfArray
const& getAccess()
const {
return mElement.getAccess();}
293 tUnderlyingType&
get() {
return mElement;}
298 TheolizerVersion(TargetCoveredArray& iElement) :
299 THEOLIZER_INTERNAL_DEBUG_ARRAY(u8
"KS :Target ", *this, iElement)
300 mElement(iElement.getElement())
301 { THEOLIZER_INTERNAL_DEBUG_ARRAY_END(); }
304 template<
class tTheolizerVersion>
305 TheolizerVersion(tTheolizerVersion& iElement) :
306 THEOLIZER_INTERNAL_DEBUG_ARRAY(u8
"KS :Next ", *this, iElement)
307 mElement(iElement.mElement)
308 { THEOLIZER_INTERNAL_DEBUG_ARRAY_END(); }
311 TheolizerVersion(TheolizerVersion& iElement) :
312 THEOLIZER_INTERNAL_DEBUG_ARRAY(u8
"KS :Same ", *this, iElement)
313 mElement(iElement.mElement)
314 { THEOLIZER_INTERNAL_DEBUG_ARRAY_END(); }
317 TheolizerVersion(TheolizerVersion&& iElement) :
318 THEOLIZER_INTERNAL_DEBUG_ARRAY(u8
"KS :Move ", *this, iElement)
319 mElement(std::move(iElement.mElement))
320 { THEOLIZER_INTERNAL_DEBUG_ARRAY_END(); }
324 THEOLIZER_INTERNAL_DEBUG_ARRAY(u8
"KS :Default ", *this)
326 { THEOLIZER_INTERNAL_DEBUG_ARRAY_END(); }
332 template<
typename tPrimitiveType>
333 struct ArrayManager< ::TheolizerNonKeepStep<tPrimitiveType, void> >
335 typedef ::TheolizerNonKeepStep<tPrimitiveType, void> TheolizerNonKeepStep;
337 template<
class tM
idSerializer,
unsigned tVersionNo>
338 struct TheolizerVersion THEOLIZER_INTERNAL_DEBUG_ARRAY_BASE
340 typedef void TheolizerArrayUnderlying;
341 typedef TheolizerNonKeepStep UnderlyingType;
346 static const bool kIsVersion=
true;
347 static const bool kIsArray=
true;
353 typedef tPrimitiveType TheolizerTarget;
356 typedef theolizer::internal::CoveredArray<TheolizerTarget> TargetCoveredArray;
360 TheolizerNonKeepStep mElement;
365 typedef TheolizerNonKeepStep AsElementOfArray;
366 AsElementOfArray& getAccess() {
return mElement;}
367 AsElementOfArray
const& getAccess()
const {
return mElement;}
370 TheolizerNonKeepStep&
get() {
return mElement;}
375 TheolizerVersion(TargetCoveredArray& iElement) :
376 THEOLIZER_INTERNAL_DEBUG_ARRAY(u8
"NKS:Target ", *this, iElement)
377 mElement(iElement.getElement())
378 { THEOLIZER_INTERNAL_DEBUG_ARRAY_END(); }
381 template<
class tTheolizerVersion>
382 TheolizerVersion(tTheolizerVersion& iElement) :
383 THEOLIZER_INTERNAL_DEBUG_ARRAY(u8
"NKS:Next ", *this, iElement)
384 mElement(iElement.mElement)
385 { THEOLIZER_INTERNAL_DEBUG_ARRAY_END(); }
388 TheolizerVersion(TheolizerVersion& iElement) :
389 THEOLIZER_INTERNAL_DEBUG_ARRAY(u8
"NKS:Same ", *this, iElement)
390 mElement(iElement.mElement)
391 { THEOLIZER_INTERNAL_DEBUG_ARRAY_END(); }
394 TheolizerVersion(TheolizerVersion&& iElement) :
395 THEOLIZER_INTERNAL_DEBUG_ARRAY(u8
"NKS:Move ", *this, iElement)
396 mElement(std::move(iElement.mElement))
397 { THEOLIZER_INTERNAL_DEBUG_ARRAY_END(); }
401 THEOLIZER_INTERNAL_DEBUG_ARRAY(u8
"NKS :Default ", *this)
403 { THEOLIZER_INTERNAL_DEBUG_ARRAY_END(); }
409 template<
typename tUnderlyingType, std::size_t tFirst, std::size_t... tDims>
410 struct ArrayManager<tUnderlyingType, tFirst, tDims...>
412 template<
class tM
idSerializer,
unsigned tVersionNo>
413 struct TheolizerVersion THEOLIZER_INTERNAL_DEBUG_ARRAY_BASE
416 typedef void TheolizerArrayVersion;
421 static const bool kIsVersion=
true;
422 static const bool kIsArray=
true;
428 typedef typename GetTheolizerTarget<tUnderlyingType>::Type TheolizerTarget;
431 typedef theolizer::internal::Array<TheolizerTarget, tFirst, tDims...>
435 typedef theolizer::internal::CoveredArray<TheolizerTarget, tFirst, tDims...>
439 typedef typename ArrayManager<tUnderlyingType, tDims...>::template
440 TheolizerVersion<tMidSerializer, tVersionNo> VersionElement;
441 typedef VersionElement VersionArray[tFirst];
444 typedef TheolizerVersion AsElementOfArray;
445 typedef typename ArrayManager<tUnderlyingType, tDims...>::template
446 TheolizerVersion<tMidSerializer, tVersionNo>::AsElementOfArray ElementType;
451 ArrayBody<VersionElement, tFirst> mArrayBody;
456 static std::size_t size() {
return tFirst;}
459 ElementType& operator[](std::size_t iIndex)
460 {
return mArrayBody.mElements[iIndex].getAccess();}
462 ElementType
const& operator[](std::size_t iIndex)
const 463 {
return mArrayBody.mElements[iIndex].getAccess();}
466 AsElementOfArray& getAccess()
470 VersionArray&
get() {
return mArrayBody.mElements;}
475 TheolizerVersion(TargetArray& iTargetArray) :
476 THEOLIZER_INTERNAL_DEBUG_ARRAY(u8
"---:Entry ", *this, iTargetArray)
477 mArrayBody(reinterpret_cast<TargetCoveredArray&>(iTargetArray).getElements(),
478 typename MakeIndices<tFirst>::Type())
479 { THEOLIZER_INTERNAL_DEBUG_ARRAY_END(); }
482 TheolizerVersion(TargetCoveredArray& iTargetCoveredArray) :
483 THEOLIZER_INTERNAL_DEBUG_ARRAY(u8
"---:Inner ", *this, iTargetCoveredArray)
484 mArrayBody(iTargetCoveredArray.getElements(),
485 typename MakeIndices<tFirst>::Type())
486 { THEOLIZER_INTERNAL_DEBUG_ARRAY_END(); }
489 TheolizerVersion(TheolizerVersion& iTheolizerVersion) :
490 THEOLIZER_INTERNAL_DEBUG_ARRAY(u8
"---:Same ", *this, iTheolizerVersion)
491 mArrayBody(iTheolizerVersion.mArrayBody)
492 { THEOLIZER_INTERNAL_DEBUG_ARRAY_END(); }
495 TheolizerVersion(TheolizerVersion&& iTheolizerVersion) :
496 THEOLIZER_INTERNAL_DEBUG_ARRAY(u8
"---:Move ", *this, iTheolizerVersion)
497 mArrayBody(std::move(iTheolizerVersion.mArrayBody))
498 { THEOLIZER_INTERNAL_DEBUG_ARRAY_END(); }
502 THEOLIZER_INTERNAL_DEBUG_ARRAY(u8
"---:Default ", *this)
504 { THEOLIZER_INTERNAL_DEBUG_ARRAY_END(); }
509 constexpr
static bool isFulfil(
unsigned iVersionNo, std::size_t iDimsCount)
511 return ((iVersionNo == tVersionNo) && (iDimsCount == (
sizeof...(tDims)+1)));
515 constexpr
static bool isHigher(
unsigned iVersionNo, std::size_t iDimsCount)
517 return ((iVersionNo == tVersionNo) && (iDimsCount < (
sizeof...(tDims)+1)));
521 constexpr
static bool isLower(
unsigned iVersionNo, std::size_t iDimsCount)
523 return ((iVersionNo == tVersionNo) && (iDimsCount > (
sizeof...(tDims)+1)));
527 constexpr
static const std::size_t getInitCount(
528 std::size_t iDstFirst, std::size_t iDstDimsCount)
530 return ((iDstDimsCount+1) <= ((
sizeof...(tDims))+1))?
531 ((iDstFirst<tFirst)?iDstFirst:tFirst)
537 template<
class tTheolizerVersion,
class tEnable=
void>
538 struct GetTheolizerVersion
540 typedef VersionArray VersionArray_t;
541 static VersionArray_t& getLower(TheolizerVersion& iTheolizerVersion)
543 return iTheolizerVersion.get();
552 template<
class tTheolizerVersion2>
553 using JudgeVersion=
typename Judge<tVersionNo+1, tTheolizerVersion2>::
554 template Dimensions<tDims...>;
560 class tTheolizerVersion,
561 THEOLIZER_INTERNAL_OVERLOAD
563 (Judge<tVersionNo+1, tTheolizerVersion>::template Dimensions<tDims...>::kFulfil)
566 TheolizerVersion(tTheolizerVersion& iTheolizerVersion) :
567 THEOLIZER_INTERNAL_DEBUG_ARRAY(u8
"---:Next-same ", *this, iTheolizerVersion)
568 mArrayBody(iTheolizerVersion.mArrayBody.mElements,
569 typename MakeIndices<
570 tTheolizerVersion::getInitCount(tFirst, sizeof...(tDims))
572 { THEOLIZER_INTERNAL_DEBUG_ARRAY_END(); }
577 class tTheolizerVersion,
578 THEOLIZER_INTERNAL_OVERLOAD
580 (Judge<tVersionNo+1, tTheolizerVersion>::template Dimensions<tDims...>::kHigher)
583 TheolizerVersion(tTheolizerVersion& iTheolizerVersion) :
584 THEOLIZER_INTERNAL_DEBUG_ARRAY(u8
"---:Next-upper", *this, iTheolizerVersion)
585 mArrayBody(tTheolizerVersion::template
586 GetTheolizerVersion<TheolizerVersion>::getLower(iTheolizerVersion),
588 typename MakeIndices<
589 tTheolizerVersion::getInitCount(tFirst, sizeof...(tDims))
591 { THEOLIZER_INTERNAL_DEBUG_ARRAY_END(); }
596 class tTheolizerVersion,
597 THEOLIZER_INTERNAL_OVERLOAD
599 (Judge<tVersionNo+1, tTheolizerVersion>::template Dimensions<tDims...>::kLower)
602 TheolizerVersion(tTheolizerVersion& iTheolizerVersion) :
603 THEOLIZER_INTERNAL_DEBUG_ARRAY(u8
"---:Next-lower", *this, iTheolizerVersion)
604 mArrayBody(VersionElement(iTheolizerVersion))
605 { THEOLIZER_INTERNAL_DEBUG_ARRAY_END(); }
612 template<
typename tUnderlyingType, std::size_t tFirst, std::size_t... tDims>
613 template<
class tM
idSerializer,
unsigned tVersionNo>
614 template<
class tTheolizerVersion>
615 struct ArrayManager<tUnderlyingType, tFirst, tDims...>::
616 TheolizerVersion<tMidSerializer, tVersionNo>::
617 GetTheolizerVersion<tTheolizerVersion, typename std::enable_if<
618 Judge<tVersionNo-1, tTheolizerVersion, void>::template
619 Dimensions<tDims...>::kLower>::type>
621 typedef typename ArrayManager<tUnderlyingType, tDims...>::template
622 TheolizerVersion<tMidSerializer, tVersionNo> LowerTheolizerVersion;
623 typedef typename LowerTheolizerVersion::template
624 GetTheolizerVersion<tTheolizerVersion>::VersionArray_t VersionArray_t;
625 static VersionArray_t& getLower(TheolizerVersion<tMidSerializer,tVersionNo>& iTheolizerVersion)
627 return LowerTheolizerVersion::template
628 GetTheolizerVersion<tTheolizerVersion>::
629 getLower(iTheolizerVersion.mArrayBody.mElements[0]);
637 #endif // THEOLIZER_INTERNAL_DOXYGEN 649 #endif // THEOLIZER_INTERNAL_VERSION_ARRAY_H