knowL: Knowledge Libraries
Loading...
Searching...
No Matches
Vector.h
1#ifndef _KNOW_CORE_VECTOR_H_
2#define _KNOW_CORE_VECTOR_H_
3
4#include <QSharedDataPointer>
5#include "ReturnValue.h"
6
7namespace knowCore
8{
9 template<typename _T_, std::size_t _dimension>
10 class Vector
11 {
12 public:
13 typedef _T_ Scalar;
14 static constexpr std::size_t Dimension = _dimension;
15 public:
16 Vector() : d(new Private) {}
17 Vector(const _T_ _v[]) : d(new Private) { memcpy(d->data, _v, _dimension * sizeof(_T_)); }
18 template<typename... Params> requires std::conjunction_v<std::is_convertible<Params, _T_>...>
19 Vector(Params... _vs) : d(new Private) { setValue(_vs...); }
20 template<template<typename, std::size_t> class _C_>
21 Vector(const _C_<_T_, _dimension>& _v) : d(new Private)
22 {
23 copyFrom(_v);
24 }
25 template<typename... Params>
26 void setValue(Params... _vs)
27 {
28 static_assert(sizeof...(Params) == _dimension);
29 setValue<0>(_vs...);
30 }
31 template<template<typename> class _C_>
32 knowCore::ReturnVoid copyFrom(const _C_<_T_>& _v)
33 {
34 if(_v.size() == _dimension)
35 {
36 for(std::size_t i = 0; i < _dimension; ++i)
37 {
38 d->data[i] = _v[i];
39 }
40 return kCrvSuccess();
41 } else {
42 return kCrvError("Invalid size of container got {} expected {}", _v.size(), _dimension);
43 }
44 }
45 template<template<typename, std::size_t> class _C_>
46 void copyFrom(const _C_<_T_, _dimension>& _v)
47 {
48 for(std::size_t i = 0; i < _dimension; ++i)
49 {
50 d->data[i] = _v[i];
51 }
52 }
53 operator QList<_T_>() const
54 {
55 QList<_T_> r;
56 for(std::size_t i = 0; i < _dimension; ++i)
57 {
58 r.append(d->data[i]);
59 }
60 return r;
61 }
62 public:
63 _T_ operator[](std::size_t _idx) const { return d->data[_idx]; }
64 _T_& operator[](std::size_t _idx) { return d->data[_idx]; }
65 public:
66 bool operator==(const Vector<_T_, _dimension>& _rhs) const
67 {
68 return memcmp(d->data, _rhs.d->data, _dimension * sizeof(_T_)) == 0;
69 }
70 bool operator!=(const Vector<_T_, _dimension>& _rhs) const
71 {
72 return not (*this == _rhs);
73 }
74 bool operator<(const Vector<_T_, _dimension>& _rhs) const
75 {
76 for(std::size_t i = 0; i < _dimension; ++i)
77 {
78 if(d->data[i] < _rhs.d->data[i]) return true;
79 }
80 return false;
81 }
82 const _T_* data() const
83 {
84 return d->data;
85 }
86 private:
87 template<std::size_t _idx, typename... Params>
88 void setValue(_T_ _v, Params... _vs)
89 {
90 d->data[_idx] = _v;
91 setValue<_idx + 1>(_vs...);
92 }
93 template<std::size_t _idx>
94 void setValue(_T_ _v)
95 {
96 d->data[_idx] = _v;
97 }
98 private:
99 struct Private : public QSharedData
100 {
101 Private() {}
102 Private(const Private& _rhs) : QSharedData() { memcpy(data, _rhs.data, _dimension * sizeof(_T_)); }
103 _T_ data[_dimension];
104 };
105 QSharedDataPointer<Private> d;
106 };
107}
108
109// #include <QDebug>
110//
111// template<typename _T_, std::size_t _dimension>
112// QDebug operator<<(QDebug dbg, const knowCore::Vector<_T_, _dimension> & v)
113// {
114// dbg << "[";
115// for(std::size_t i = 0; i < _dimension; ++i)
116// {
117// if(i!= 0)
118// dbg << ", ";
119// dbg << v[i];
120// }
121// dbg << "]";
122// return dbg;
123// }
124
125#endif
Definition Forward.h:12
Definition ReturnValue.h:85
Definition Vector.h:11