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