Loading [MathJax]/extensions/tex2jax.js
Radium Engine  1.5.28
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
attribmanager.cpp
1#include <Core/Types.hpp>
2#include <Core/Utils/Attribs.hpp>
3#include <Core/Utils/ContainerIntrospectionInterface.hpp>
4#include <Core/Utils/Index.hpp>
5#include <Eigen/Core>
6
7#include <catch2/catch_test_macros.hpp>
8
9#include <string>
10
11using namespace Ra::Core;
12using namespace Ra::Core::Utils;
13
14TEST_CASE( "Core/Utils/Attibs", "[unittests][Core][Utils][Attribs]" ) {
15
16 enum Enum1 { A, B, C };
17 enum class Enum2 : char { A = 'a', B, C };
18
19 Attrib<Scalar> attr1 { "attr float" };
20 Attrib<Vector3> attr2 { "attr vec3" };
21 Attrib<std::string> attr3 { "attr string" };
22 Attrib<Enum1> attr4 { "attr enum1" };
23 Attrib<Enum2> attr5 { "attr enum3" };
24 Attrib<VectorNd> attr6 { "attr vecN" };
25
26 SECTION( "type check" ) {
27 REQUIRE( attr1.isFloat() );
28 REQUIRE( !attr1.isType<int>() );
29 REQUIRE( attr2.isVector3() );
30 REQUIRE( attr3.isType<std::string>() );
31 REQUIRE( attr4.isType<Enum1>() );
32 REQUIRE( attr5.isType<Enum2>() );
33 REQUIRE( !attr5.isType<char>() );
34 REQUIRE( attr6.isType<VectorNd>() );
35
36 REQUIRE( attr1.getNumberOfComponents() == 1 );
37 REQUIRE( attr2.getNumberOfComponents() == 3 );
38 REQUIRE( attr3.getNumberOfComponents() == 0 );
39 REQUIRE( attr4.getNumberOfComponents() == 1 );
40 REQUIRE( attr5.getNumberOfComponents() == 1 );
41 REQUIRE( attr6.getNumberOfComponents() == 0 );
42
43 REQUIRE( attr1.getStride() == sizeof( Scalar ) );
44 REQUIRE( attr2.getStride() == sizeof( Vector3 ) );
45 REQUIRE( attr3.getStride() == sizeof( std::string ) );
46 REQUIRE( attr4.getStride() == sizeof( Enum1 ) );
47 REQUIRE( attr5.getStride() == sizeof( Enum2 ) );
48 REQUIRE( attr6.getStride() == sizeof( VectorNd ) );
49 }
50
51 SECTION( "const ref setData" ) {
52 Attrib<Scalar>::Container attr1content = { 1_ra, 2_ra, 3_ra };
53 Attrib<Vector3>::Container attr2content = {
54 { 1_ra, 1_ra, 1_ra }, { 2_ra, 2_ra, 2_ra }, { 3_ra, 3_ra, 3_ra } };
55 Attrib<std::string>::Container attr3content = { "one", "two", "three" };
56 Attrib<Enum1>::Container attr4content = { Enum1::A, Enum1::B, Enum1::C };
57 Attrib<Enum2>::Container attr5content = { Enum2::A, Enum2::B, Enum2::C };
58
59 attr1.setData( attr1content );
60 attr2.setData( attr2content );
61 attr3.setData( attr3content );
62 attr4.setData( attr4content );
63 attr5.setData( attr5content );
64
65 REQUIRE( attr1.getSize() == 3 );
66 REQUIRE( attr2.getSize() == 3 );
67 REQUIRE( attr3.getSize() == 3 );
68 REQUIRE( attr4.getSize() == 3 );
69 REQUIRE( attr5.getSize() == 3 );
70
71 auto& cont1 = attr1.data();
72 auto& cont2 = attr2.data();
73 auto& cont3 = attr3.data();
74 auto& cont4 = attr4.data();
75 auto& cont5 = attr5.data();
76 REQUIRE( cont1.data() == attr1.dataPtr() );
77 REQUIRE( cont2.data() == attr2.dataPtr() );
78 REQUIRE( cont3.data() == attr3.dataPtr() );
79 REQUIRE( cont4.data() == attr4.dataPtr() );
80 REQUIRE( cont5.data() == attr5.dataPtr() );
81
82 REQUIRE( attr1.getBufferSize() == 3 * sizeof( Scalar ) );
83 REQUIRE( attr2.getBufferSize() == 3 * sizeof( Vector3 ) );
84 REQUIRE( attr3.getBufferSize() == 3 * sizeof( std::string ) );
85 REQUIRE( attr4.getBufferSize() == 3 * sizeof( Enum1 ) );
86 REQUIRE( attr5.getBufferSize() == 3 * sizeof( Enum2 ) );
87
88 VectorNd x { 2 };
89 x << 1_ra, 2_ra;
90 attr6.setData( { x } );
91 REQUIRE( attr6.getBufferSize() == 1 * sizeof( VectorNd ) );
92 }
93 SECTION( "move setData" ) {
94 Attrib<Scalar>::Container attr1content = { 1_ra, 2_ra, 3_ra };
95 Attrib<Vector3>::Container attr2content = {
96 { 1_ra, 1_ra, 1_ra }, { 2_ra, 2_ra, 2_ra }, { 3_ra, 3_ra, 3_ra } };
97 Attrib<std::string>::Container attr3content = { "one", "two", "three" };
98 Attrib<Enum1>::Container attr4content = { Enum1::A, Enum1::B, Enum1::C };
99 Attrib<Enum2>::Container attr5content = { Enum2::A, Enum2::B, Enum2::C };
100
101 attr1.setData( std::move( attr1content ) );
102 attr2.setData( std::move( attr2content ) );
103 attr3.setData( std::move( attr3content ) );
104 attr4.setData( std::move( attr4content ) );
105 attr5.setData( std::move( attr5content ) );
106
107 REQUIRE( attr1.getSize() == 3 );
108 REQUIRE( attr2.getSize() == 3 );
109 REQUIRE( attr3.getSize() == 3 );
110 REQUIRE( attr4.getSize() == 3 );
111 REQUIRE( attr5.getSize() == 3 );
112
113 auto& cont1 = attr1.data();
114 auto& cont2 = attr2.data();
115 auto& cont3 = attr3.data();
116 auto& cont4 = attr4.data();
117 auto& cont5 = attr5.data();
118 REQUIRE( cont1.data() == attr1.dataPtr() );
119 REQUIRE( cont2.data() == attr2.dataPtr() );
120 REQUIRE( cont3.data() == attr3.dataPtr() );
121 REQUIRE( cont4.data() == attr4.dataPtr() );
122 REQUIRE( cont5.data() == attr5.dataPtr() );
123 }
124}
125
126TEST_CASE( "Core/Utils/AttibManager", "[unittests][Core][Utils][Attribs][AttribManager]" ) {
127 SECTION( "init and clear" ) {
128 AttribManager m1;
129 auto m1attr1 = m1.addAttrib<float>( "float" );
130 auto m1attr2 = m1.addAttrib<double>( "double" );
131 REQUIRE( m1.contains( "float" ) );
132 REQUIRE( m1.contains( "double" ) );
133 REQUIRE( m1.isValid( m1attr1 ) );
134 REQUIRE( m1.isValid( m1attr2 ) );
135 REQUIRE( !( m1attr1 == m1attr2 ) );
136 REQUIRE( m1.getNumAttribs() == 2 );
137 auto m1attr1bis = m1.findAttrib<float>( "float" );
138 auto m1attr2bis = m1.findAttrib<double>( "double" );
139 REQUIRE( m1.isValid( m1attr1bis ) );
140 REQUIRE( m1.isValid( m1attr2bis ) );
141 REQUIRE( m1attr1 == m1attr1bis );
142 REQUIRE( m1attr1.idx() == m1attr1bis.idx() );
143 REQUIRE( m1attr2.idx() == m1attr2bis.idx() );
144 m1.clear();
145 REQUIRE( !m1.contains( "float" ) );
146 REQUIRE( !m1.contains( "double" ) );
147 REQUIRE( !m1.isValid( m1attr1 ) );
148 REQUIRE( !m1.isValid( m1attr2 ) );
149 REQUIRE( m1.getNumAttribs() == 0 );
150 m1attr1bis = m1.findAttrib<float>( "float" );
151 m1attr2bis = m1.findAttrib<double>( "double" );
152 REQUIRE( !m1.isValid( m1attr1bis ) );
153 REQUIRE( !m1.isValid( m1attr2bis ) );
154 }
155 SECTION( "init and remove" ) {
156 AttribManager m1;
157 auto m1attr1 = m1.addAttrib<float>( "float" );
158 auto m1attr2 = m1.addAttrib<double>( "double" );
159 REQUIRE( m1.contains( "float" ) );
160 REQUIRE( m1.contains( "double" ) );
161 REQUIRE( m1.isValid( m1attr1 ) );
162 REQUIRE( m1.isValid( m1attr2 ) );
163 m1.removeAttrib( m1attr1 );
164 REQUIRE( !m1.contains( "float" ) );
165 REQUIRE( m1.contains( "double" ) );
166 REQUIRE( !m1.isValid( m1attr1 ) );
167 REQUIRE( m1.isValid( m1attr2 ) );
168 REQUIRE( m1.getNumAttribs() == 1 );
169 auto m1attr1bis = m1.findAttrib<float>( "float" );
170 auto m1attr2bis = m1.findAttrib<double>( "double" );
171 REQUIRE( !m1.isValid( m1attr1bis ) );
172 REQUIRE( m1.isValid( m1attr2bis ) );
173 REQUIRE( m1attr2bis.idx() == m1attr2.idx() );
174 }
175 SECTION( "get attrib and data" ) {
176 AttribManager m1;
177 const AttribManager& m1Const = m1;
178
179 auto m1attr1 = m1.addAttrib<Vector3>( "vec3" );
180 auto attr1ptr = m1.getAttribPtr( m1attr1 );
181
182 auto basePtrFromName = m1.getAttribBase( "vec3" );
183 auto basePtrFromIdx = m1.getAttribBase( m1attr1.idx() );
184 auto invalidPtrFromName = m1.getAttribBase( "invalid" );
185 auto invalidPtrFromIdx = m1.getAttribBase( Index::Invalid() );
186 const auto baseConstPtrFromName = m1Const.getAttribBase( "vec3" );
187 const auto baseConstPtrFromIdx = m1Const.getAttribBase( m1attr1.idx() );
188 const auto invalidConstPtrFromName = m1Const.getAttribBase( "invalid" );
189 const auto invalidConstPtrFromIdx = m1Const.getAttribBase( Index::Invalid() );
190
191 REQUIRE( basePtrFromName == attr1ptr );
192 REQUIRE( baseConstPtrFromName == attr1ptr );
193 REQUIRE( basePtrFromIdx == attr1ptr );
194 REQUIRE( baseConstPtrFromIdx == attr1ptr );
195 REQUIRE( invalidPtrFromName == nullptr );
196 REQUIRE( invalidConstPtrFromName == nullptr );
197 REQUIRE( invalidPtrFromIdx == nullptr );
198 REQUIRE( invalidConstPtrFromIdx == nullptr );
199 }
200}
The AttribManager provides attributes management by handles.
Definition Attribs.hpp:212
AttribBase * getAttribBase(const std::string &name)
Definition Attribs.hpp:696
int getNumAttribs() const
Return the number of attributes.
Definition Attribs.hpp:773
AttribHandle< T > addAttrib(const std::string &name)
Definition Attribs.hpp:719
bool contains(const std::string &name) const
contains Check if an attribute with the given name exists.
Definition Attribs.hpp:625
bool isValid(const AttribHandle< T > &h) const
Return true if h correspond to an existing attribute in *this.
Definition Attribs.hpp:620
void clear()
clear all attribs, invalidate handles.
Definition Attribs.cpp:17
void removeAttrib(AttribHandle< T > &h)
Definition Attribs.hpp:747
AttribHandle< T > findAttrib(const std::string &name) const
findAttrib Grab an attribute handler by name.
Definition Attribs.hpp:630
T move(T... args)
This namespace contains everything "low level", related to data, datastuctures, and computation.
Definition Cage.cpp:5