7#include <initializer_list>
121template <
int MaxSize,
class Element =
double>
139 explicit TFastVector(
int componentsCount,
const Element& value = Element());
155 Q_ASSERT(Size <= MaxSize);
157 for (
int i = 0; i < Size; ++i){
324template <
int MaxSize,
class Element>
331template <
int MaxSize,
class Element>
333: m_elementsCount(qMin(MaxSize, componentsCount))
341template <
int MaxSize,
class Element>
343: m_elementsCount(vector.m_elementsCount)
351template <
int MaxSize,
class Element>
353: m_elementsCount(qMin(MaxSize, static_cast<int>(values.size())))
355 Q_ASSERT(values.size() <= MaxSize);
363template <
int MaxSize,
class Element>
366 return m_elementsCount;
370template <
int MaxSize,
class Element>
373 if (count <= MaxSize){
374 for (
int i = m_elementsCount; i < count; ++i){
375 m_elements[i] = value;
378 m_elementsCount = count;
388template <
int MaxSize,
class Element>
391 if (count <= MaxSize){
392 if (m_elementsCount < count){
393 for (
int i = m_elementsCount; i < count; ++i){
394 m_elements[i] = value;
397 m_elementsCount = count;
408template <
int MaxSize,
class Element>
412 Q_ASSERT(i < m_elementsCount);
414 return m_elements[i];
418template <
int MaxSize,
class Element>
422 Q_ASSERT(i < m_elementsCount);
424 return m_elements[i];
428template <
int MaxSize,
class Element>
432 Q_ASSERT(i < m_elementsCount);
434 m_elements[i] = value;
438template <
int MaxSize,
class Element>
441 for (
int i = 0; i < m_elementsCount; ++i){
447template <
int MaxSize,
class Element>
451 for (
int i = 0; i < commonSize; ++i){
457template <
int MaxSize,
class Element>
462 for (; i < m_elementsCount; ++i){
463 m_elements[i] += vector.
m_elements[i] * scale;
474 m_elements[i] += vector.
m_elements[i] * scale;
480template <
int MaxSize,
class Element>
485 for (
int i = 0; i < commonSize; ++i){
486 SetElement(i, vector[i]);
489 for (
int i = commonSize; i < m_elementsCount; ++i){
490 SetElement(i, expansionValue);
495template <
int MaxSize,
class Element>
498 return *
this + vector;
502template <
int MaxSize,
class Element>
511template <
int MaxSize,
class Element>
514 return GetLength2() <= tolerance * tolerance;
518template <
int MaxSize,
class Element>
521 Element retVal = 0.0;
524 for (
int i = 0; i < commonSize; ++i){
525 retVal += m_elements[i] * vector.
m_elements[i];
532template <
int MaxSize,
class Element>
535 return GetDotProduct(*
this);
539template <
int MaxSize,
class Element>
542 return qSqrt(GetLength2());
546template <
int MaxSize,
class Element>
549 return (*
this - vector).GetLength2();
553template <
int MaxSize,
class Element>
556 return qSqrt(GetDistance2(vector));
562template <
int MaxSize,
class Element>
569 for (
int i = 0; i < m_elementsCount; ++i){
579template <
int MaxSize,
class Element>
582 return !operator==(vector);
586template <
int MaxSize,
class Element>
590 for (
int i = 0; i < commonSize; ++i){
594 else if (m_elements[i] < vector.
m_elements[i]){
603template <
int MaxSize,
class Element>
607 for (
int i = 0; i < commonSize; ++i){
611 else if (m_elements[i] < vector.
m_elements[i]){
620template <
int MaxSize,
class Element>
624 for (
int i = 0; i < commonSize; ++i){
628 else if (m_elements[i] < vector.
m_elements[i]){
637template <
int MaxSize,
class Element>
641 for (
int i = 0; i < commonSize; ++i){
645 else if (m_elements[i] < vector.
m_elements[i]){
654template <
int MaxSize,
class Element>
658 Q_ASSERT(m_elementsCount < MaxSize);
660 for (
int i = 0; i < m_elementsCount; ++i){
668template <
int MaxSize,
class Element>
673 for (; i < m_elementsCount; ++i){
693template <
int MaxSize,
class Element>
698 for (; i < m_elementsCount; ++i){
718template <
int MaxSize,
class Element>
721 for (
int i = 0; i < m_elementsCount; ++i){
722 m_elements[i] *= scalar;
729template <
int MaxSize,
class Element>
732 for (
int i = 0; i < m_elementsCount; ++i){
733 m_elements[i] /= scalar;
740template <
int MaxSize,
class Element>
745 for (
int i = 0; i < m_elementsCount; ++i){
753template <
int MaxSize,
class Element>
764template <
int MaxSize,
class Element>
775template <
int MaxSize,
class Element>
786template <
int MaxSize,
class Element>
797template <
int MaxSize,
class Element>
801 Q_ASSERT(i < m_elementsCount);
803 return m_elements[i];
807template <
int MaxSize,
class Element>
811 Q_ASSERT(i < MaxSize);
813 return m_elements[i];
819template <
int MaxSize,
class Element>
824 for (
int i = 0; i < m_elementsCount; ++i){
825 retVal += m_elements[i];
832template <
int MaxSize,
class Element>
835 Element isLength = GetLength();
837 Element proportion = isLength / length;
840 for (
int i = 0; i < m_elementsCount; ++i){
841 m_elements[i] = m_elements[i] / proportion;
852template <
int MaxSize,
class Element>
861template <
int MaxSize,
class Element>
868 for (
int i = 0; i < elementsCount; ++i){
874template <
int MaxSize,
class Element>
881 for (
int i = 0; i < elementsCount; ++i){
887template <
int MaxSize,
class Element>
895 retVal = retVal && archive.
BeginMultiTag(elementsTag, elementTag, m_elementsCount);
897 if (!retVal || (m_elementsCount > MaxSize)){
905 for (
int i = 0; i < m_elementsCount; ++i){
906 retVal = retVal && archive.
BeginTag(elementTag);
907 retVal = retVal && archive.
Process(m_elements[i]);
908 retVal = retVal && archive.
EndTag(elementTag);
911 retVal = retVal && archive.
EndTag(elementsTag);
919template <
int MaxSize,
class Element>
925 for (
int i = 0; i < elementsCount; ++i){
926 double element = v[i];
928 retVal = (retVal << 1) ^ *((uint*)&element) + 1;
Optimized implementation of a variable-size vector with compile-time maximum capacity.
TFastVector(std::initializer_list< Element > values)
Initializer list constructor.
TFastVector< MaxSize, Element > operator-() const
void Clear()
Set all coordinates to zero.
const Element & GetElement(int i) const
Get element at specified i.
bool GetNormalized(TFastVector< MaxSize, Element > &result, Element length=1.0) const
Return normalized vector with the same direction and specified length.
Element GetDistance(const TFastVector< MaxSize, Element > &vector) const
Return distance between two vectors.
TFastVector< MaxSize, Element > & operator-=(const TFastVector< MaxSize, Element > &vector)
Element GetLength2() const
Return euclidian length square.
bool Normalize(Element length=1.0)
Normalize vector to specified length.
void SetElementsFrom(const TFastVector &vector, const Element &expansionValue=Element())
Set elemenents from other vector without resizing.
TFastVector< MaxSize, Element > & operator/=(Element scalar)
bool operator<=(const TFastVector< MaxSize, Element > &vector) const
bool operator>=(const TFastVector< MaxSize, Element > &vector) const
Element GetElementsSum() const
Get simple sum of all elements.
bool SetElementsCount(int count, const Element &value=Element())
Set number of elements.
bool operator==(const TFastVector< MaxSize, Element > &vector) const
void SetElement(int i, const Element &value)
Set element at specified i.
void GetMaximal(const TFastVector< MaxSize, Element > &vector, TFastVector< MaxSize, Element > &result) const
Get vector with maximal elements values.
TFastVector< MaxSize, Element > operator+(const TFastVector< MaxSize, Element > &vector) const
int GetElementsCount() const
Get number of elements.
TFastVector()
Create an uninitialized point.
TFastVector< MaxSize, Element > & operator=(const TFastVector< MaxSize, Element > &vector)
TFastVector< MaxSize, Element > operator*(Element scalar) const
Element m_elements[MaxSize]
void ScaledCumulate(const TFastVector< MaxSize, Element > &vector, Element scale)
Add second vector scaled by specified factor.
bool operator<(const TFastVector< MaxSize, Element > &vector) const
void GetMinimal(const TFastVector< MaxSize, Element > &vector, TFastVector< MaxSize, Element > &result) const
Get vector with minimal elements values.
TFastVector< MaxSize, Element > & operator+=(const TFastVector< MaxSize, Element > &vector)
Element GetDotProduct(const TFastVector< MaxSize, Element > &vector) const
Return dot product of two vectors.
bool operator!=(const TFastVector< MaxSize, Element > &vector) const
bool IsNull(Element tolerance=I_BIG_EPSILON) const
Check if this vector is null.
Element & GetElementRef(int i)
Get reference to element at specified i.
bool EnsureElementsCount(int count, const Element &value=Element())
Ensure, that number of elements vector cannot be smaller that some value.
TFastVector< MaxSize, Element > GetTranslated(const TFastVector< MaxSize, Element > &vector)
Get translated point.
bool Serialize(iser::IArchive &archive)
Serialize this vector to specified archive.
TFastVector(const imath::TVector< Size, Element > &vector)
const Element & operator[](int i) const
bool operator>(const TFastVector< MaxSize, Element > &vector) const
Element GetDistance2(const TFastVector< MaxSize, Element > &vector) const
Return distance square between two vectors.
void Translate(const TFastVector< MaxSize, Element > &vector)
Translate the point.
TFastVector< MaxSize, Element > operator-(const TFastVector< MaxSize, Element > &vector) const
TFastVector(const TFastVector< MaxSize, Element > &vector)
Copy constructor.
TFastVector(int componentsCount, const Element &value=Element())
Create vector and initialize number of components.
void GetTranslated(const TFastVector< MaxSize, Element > &vector, TFastVector< MaxSize, Element > &result)
/overloaded
Element & operator[](int i)
TFastVector< MaxSize, Element > & operator*=(Element scalar)
Element GetLength() const
Return euclidian length.
TFastVector< MaxSize, Element > operator/(Element scalar) const
Implementation of fixed-size mathematical vector with specified type of elements.
Process tag used to group data in archive stream.
@ TT_LEAF
Leaf tag, it can contain only one primitive element.
@ TT_MULTIPLE
Multiple tag containing variable number of child tags.
Represents an input/output persistence archive for object serialization.
virtual bool Process(bool &value)=0
Processes (reads or writes) a boolean value.
virtual bool EndTag(const CArchiveTag &tag)=0
Ends a tagged section in the archive.
virtual bool BeginMultiTag(const CArchiveTag &tag, const CArchiveTag &subTag, int &count)=0
Begins a tagged section containing multiple elements of the same type.
virtual bool IsStoring() const =0
Checks if this archive is in storing (writing) or loading (reading) mode.
virtual bool BeginTag(const CArchiveTag &tag)=0
Begins a tagged section in the archive.
static const double I_BIG_EPSILON
Package with mathematical functions and algebraical primitives.
uint qHash(const TFastVector< MaxSize, Element > &v, uint seed=0)