Loading TemplateTest/main.cpp +25 −24 Original line number Original line Diff line number Diff line Loading @@ -298,12 +298,12 @@ void testMemberRef(){ //DBGVAR(Traits<tempData>::ttype::getName<0>()); //DBGVAR(Traits<tempData>::ttype::getName<0>()); Traits<tempData>::ttype::getReference<0>()->setValue(&d, 0.0); Traits<tempData>::tr.getReference<0>().setValue(&d, 0.0); DBGVAR(Traits<tempData>::ttype::getReference<0>()->getValue(&d)); DBGVAR(Traits<tempData>::tr.getReference<0>().getValue(&d)); Traits<tempData>::ttype::getReference<0>()->setValue(d, 42.15); Traits<tempData>::tr.getReference<0>().setValue(d, 42.15); Traits<tempData>::ttype::getReference<1>()->setValue(&d, {42.15,84.30,42.15}); Traits<tempData>::tr.getReference<1>().setValue(&d, {42.15,84.30,42.15}); DBGVAR(Traits<tempData>::ttype::getName<0>(),(Traits<tempData>::ttype::getReference<0>()->getValue(&d)), Traits<tempData>::ttype::getName<1>(),(Traits<tempData, double, Vector<3,double>>::getReference<1>()->getValue(&d)), d.velocity); DBGVAR(Traits<tempData>::tr.getName<0>(),(Traits<tempData>::tr.getReference<0>().getValue(&d)), Traits<tempData>::tr.getName<1>(), d.velocity); DBGVAR(Traits<tempData>::is_specialized,HasDefaultTraits<tempData>::value, d); DBGVAR(Traits<tempData>::is_specialized,HasDefaultTraits<tempData>::value, d); ExportTest e; ExportTest e; Loading @@ -319,7 +319,7 @@ Test of trasposing vector of struct to struct of vectors */ */ template <typename DataType, typename DataTypeTrait = typename Traits<DataType>::ttype> template <typename DataType, typename DataTypeTrait = Traits<DataType>> struct Container{ struct Container{ template <unsigned int index = 0, typename Dummy = void> template <unsigned int index = 0, typename Dummy = void> struct StructOfArrays : public StructOfArrays<index + 1>{ struct StructOfArrays : public StructOfArrays<index + 1>{ Loading @@ -340,7 +340,7 @@ struct Container{ template <unsigned int pos> template <unsigned int pos> const std::string& name() { const std::string& name() { return DataTypeTrait::template getName<pos>(); return Traits<DataType>::tr.template getName<pos>(); } } template <unsigned int pos> template <unsigned int pos> Loading @@ -350,7 +350,6 @@ struct Container{ }; }; void testStructTransposition() { void testStructTransposition() { Container<ExportTest, Traits<ExportTest>::ttype> data; Container<ExportTest, Traits<ExportTest>::ttype> data; Loading @@ -360,6 +359,7 @@ void testStructTransposition() { }; }; /** /** Test TraitApply Test TraitApply */ */ Loading @@ -370,7 +370,7 @@ struct TraitApply { }; }; */ */ /* template < unsigned int index> template < unsigned int index> class TraitApply { class TraitApply { public: public: Loading Loading @@ -505,6 +505,7 @@ public: Functor<ExportTest, Traits<ExportTest>::ttype::type<0>>()(0, Traits<ExportTest>::ttype::getReference<0>(), Traits<ExportTest>::ttype::getName<0>()); Functor<ExportTest, Traits<ExportTest>::ttype::type<0>>()(0, Traits<ExportTest>::ttype::getReference<0>(), Traits<ExportTest>::ttype::getName<0>()); } } }; }; */ struct Depth { struct Depth { int value = 0; int value = 0; Loading @@ -515,19 +516,19 @@ class Func { public: public: template <typename U = T> template <typename U = T> auto operator()(unsigned int index, const std::unique_ptr<MemberApproach<Class, T>>&, const std::string& name) auto operator()(unsigned int index, const MemberApproach<Class, T>&, const std::string& name) -> typename std::enable_if<!(HasDefaultTraits<U>::value)>::type -> typename std::enable_if<!(HasDefaultTraits<U>::value)>::type { { DBGVAR(Singleton<Depth>::getInstance().value,index, name); DBGVAR(Singleton<Depth>::getInstance().value,index, name); } } template <typename U = T> template <typename U = T> auto operator()(unsigned int index, const std::unique_ptr<MemberApproach<Class, T>>&, const std::string& name) auto operator()(unsigned int index, const MemberApproach<Class, T>&, const std::string& name) -> typename std::enable_if<HasDefaultTraits<U>::value>::type -> typename std::enable_if<HasDefaultTraits<U>::value>::type { { DBGVAR(Singleton<Depth>::getInstance().value,index, name); DBGVAR(Singleton<Depth>::getInstance().value,index, name); Singleton<Depth>::getInstance().value++; Singleton<Depth>::getInstance().value++; Traits<T>::ttype::template apply<Func>(); Traits<T>::tr.template apply<Func>(); Singleton<Depth>::getInstance().value--; Singleton<Depth>::getInstance().value--; } } }; }; Loading @@ -540,18 +541,18 @@ void testTraitApply() { DBGVAR(std::is_function<decltype (lambda)>::value); DBGVAR(std::is_function<decltype (lambda)>::value); TraitApply<5>::apply(lambda); //TraitApply<5>::apply(lambda); auto lambda1 = []( auto& , const std::string& name){DBGVAR(name);}; auto lambda1 = []( auto& , const std::string& name){DBGVAR(name);}; TraitApply<5>::apply(lambda1); //TraitApply<5>::apply(lambda1); DBGMSG("Tady"); DBGMSG("Tady"); Traits<ExportTest>::ttype::apply<Func>(); Traits<ExportTest>::tr.apply<Func>(); //TraitApply<5>::apply<Func>(); //TraitApply<5>::apply<Func>(); Traits<ExportTest>::ttype::apply(lambda); Traits<ExportTest>::tr.apply(lambda); Traits<ExportTest>::ttype::apply(lambda1); Traits<ExportTest>::tr.apply(lambda1); //Traits<ExportTest>::ttype::apply<Func>(); //Traits<ExportTest>::ttype::apply<Func>(); Loading @@ -561,7 +562,7 @@ DBGMSG("Tady"); /* /* * * * Compile time traits * Compile time traits DONE */ */ #include <cstdio> #include <cstdio> Loading Loading @@ -863,7 +864,7 @@ private: template<unsigned int Index = 0, typename Dummy = void> template<unsigned int Index = 0, typename Dummy = void> struct MemRefs: public MemRefs<Index + 1> { struct MemRefs: public MemRefs<Index + 1> { const TestMemberReference<Class, type<Index>, refType<Index>> ref; const MemberReference<Class, type<Index>, refType<Index>> ref; std::string name; std::string name; template <typename ... REST> template <typename ... REST> Loading @@ -872,7 +873,7 @@ private: template<typename Dummy> template<typename Dummy> struct MemRefs<sizeof...(RefTypes) - 1, Dummy>{ struct MemRefs<sizeof...(RefTypes) - 1, Dummy>{ const TestMemberReference<Class, type<sizeof...(RefTypes) - 1>, refType<sizeof...(RefTypes) - 1>> ref; const MemberReference<Class, type<sizeof...(RefTypes) - 1>, refType<sizeof...(RefTypes) - 1>> ref; std::string name; std::string name; MemRefs(std::string n, refType<sizeof...(RefTypes) - 1> r) : ref(r), name(n){} MemRefs(std::string n, refType<sizeof...(RefTypes) - 1> r) : ref(r), name(n){} Loading Loading @@ -912,7 +913,7 @@ public: template<unsigned int Index> template<unsigned int Index> const TestMemberReference<Class, type<Index>, refType<Index>>& getReference(){ const MemberReference<Class, type<Index>, refType<Index>>& getReference(){ return refs.MemRefs<Index, void>::ref; return refs.MemRefs<Index, void>::ref; } } Loading Loading @@ -1145,7 +1146,7 @@ void testTraitPerformance() { res = 0; res = 0; for(int rep = 0; rep < maxRep; rep++){ for(int rep = 0; rep < maxRep; rep++){ for(size_t i = 0; i < vec.size(); i++) { for(size_t i = 0; i < vec.size(); i++) { res += Traits<ExportTest>::ttype::getValue<1>(vec[i]); res += Traits<ExportTest>::tr.getValue<1>(vec[i]); } } duration += (clock.now() - start).count(); duration += (clock.now() - start).count(); deviation += (clock.now() - start).count() * (clock.now() - start).count(); deviation += (clock.now() - start).count() * (clock.now() - start).count(); Loading Loading @@ -1300,7 +1301,7 @@ MAKE_NAMED_ATTRIBUTE_TRAIT(privateAttr, "str_attr", attr); void testPrivateTrait(){ void testPrivateTrait(){ privateAttr a; privateAttr a; DBGVAR(a); DBGVAR(a); Traits<privateAttr>::ttype::setValue<0>(a, "new value"); Traits<privateAttr>::tr.setValue<0>(a, "new value"); DBGVAR(a); DBGVAR(a); } } Loading Loading @@ -1471,7 +1472,7 @@ int main() //testStructTransposition(); //testStructTransposition(); //testTraitApply(); //testTraitApply(); //testCompileTimeTraits(); //testCompileTimeTraits(); testTraitPerformance(); //testTraitPerformance(); //testCustomUnorderedMap(); //testCustomUnorderedMap(); //testPrivateTrait(); //testPrivateTrait(); //testJson(); //testJson(); Loading Unstructured_mesh/main.cpp +4 −4 Original line number Original line Diff line number Diff line Loading @@ -661,7 +661,7 @@ struct colourData { Vector<3, double> firstEdgeNormal; Vector<3, double> firstEdgeNormal; }; }; MAKE_ATTRIBUTE_TRAIT(colourData, colour, firstEdgeNormal); MAKE_ATTRIBUTE_TRAIT(colourData, firstEdgeNormal, colour); void testMeshRefine() { void testMeshRefine() { UnstructuredMesh<3, size_t, double, 6> mesh; UnstructuredMesh<3, size_t, double, 6> mesh; Loading Loading @@ -722,7 +722,7 @@ void testMeshRefine() { ifstream in3D; ifstream in3D; in3D.open("mesh_refine_1.vtk"); in3D.open("mesh_refine_1.vtk", std::ios::binary); VTKMeshReader<3> reader; VTKMeshReader<3> reader; reader.loadFromStream(in3D, mesh); reader.loadFromStream(in3D, mesh); Loading Loading @@ -1019,9 +1019,9 @@ int main() //meshSize(); //meshSize(); //testMesh2D(); //testMesh2D(); //testMesh2DLoadAndWrite(); //testMesh2DLoadAndWrite(); testMesh3D(); //testMesh3D(); //test3DMeshDeformedPrisms(); //test3DMeshDeformedPrisms(); //testMeshRefine(); testMeshRefine(); //testMeshDataContainer(); //testMeshDataContainer(); //UnstructuredMesh<5, size_t, double, 6,5,4> m; //UnstructuredMesh<5, size_t, double, 6,5,4> m; //m.ComputeElementMeasures(); //m.ComputeElementMeasures(); Loading src/Debug/VariableExport.h +10 −10 Original line number Original line Diff line number Diff line Loading @@ -153,8 +153,8 @@ struct VariableExport { template<typename T,unsigned int Index = 0, typename Void = void> template<typename T,unsigned int Index = 0, typename Void = void> struct PrintClass{ struct PrintClass{ static void print(std::ostream& ost, const T &traitedClass){ static void print(std::ostream& ost, const T &traitedClass){ ost << '"' << Traits<T>::ttype::template getName<Index>() << "\" : "; ost << '"' << Traits<T>::tr.template getName<Index>() << "\" : "; VariableExport::exportVariable(ost, Traits<T>::ttype::template getReference<Index>()->getValue(traitedClass)); VariableExport::exportVariable(ost, Traits<T>::tr.template getValue<Index>(traitedClass)); ost << ", "; ost << ", "; PrintClass<T, Index + 1>::print(ost, traitedClass); PrintClass<T, Index + 1>::print(ost, traitedClass); Loading @@ -163,9 +163,9 @@ struct VariableExport { template<typename T,unsigned int Index, typename... Types> template<typename T,unsigned int Index, typename... Types> struct PrintClass <Traits<T, Types...>, Index, typename std::enable_if<Index < Traits<T, Types...>::size() - 1>::type>{ struct PrintClass <Traits<T, Types...>, Index, typename std::enable_if<Index < Traits<T, Types...>::size() - 1>::type>{ static void print(std::ostream& ost, const T &traitedClass){ static void print(std::ostream& ost, const T &traitedClass, const Traits<T, Types...>& trait = Traits<T>::tr){ ost << '"' << Traits<T, Types...>::template getName<Index>() << "\" : "; ost << '"' << trait.template getName<Index>() << "\" : "; VariableExport::exportVariable(ost, Traits<T, Types...>::template getReference<Index>()->getValue(traitedClass)); VariableExport::exportVariable(ost, trait.template getValue<Index>(traitedClass)); ost << ", "; ost << ", "; PrintClass<Traits<T, Types...>, Index + 1>::print(ost, traitedClass); PrintClass<Traits<T, Types...>, Index + 1>::print(ost, traitedClass); Loading @@ -174,17 +174,17 @@ struct VariableExport { template<typename T,unsigned int Index, typename ... Types> template<typename T,unsigned int Index, typename ... Types> struct PrintClass <Traits<T, Types...>, Index, typename std::enable_if<Index == Traits<T, Types...>::size() - 1>::type>{ struct PrintClass <Traits<T, Types...>, Index, typename std::enable_if<Index == Traits<T, Types...>::size() - 1>::type>{ static void print(std::ostream& ost, const T &traitedClass){ static void print(std::ostream& ost, const T &traitedClass, const Traits<T, Types...>& trait = Traits<T>::tr){ ost << '"' << Traits<T, Types...>::template getName<Traits<T, Types...>::size() - 1>() << "\" : "; ost << '"' << trait.template getName<Traits<T, Types...>::size() - 1>() << "\" : "; VariableExport::exportVariable(ost, Traits<T, Types...>::template getReference<Traits<T, Types...>::size() - 1>()->getValue(traitedClass)); VariableExport::exportVariable(ost, trait.template getValue<Traits<T, Types...>::size() - 1>(traitedClass)); } } }; }; template<typename T, unsigned int Index> template<typename T, unsigned int Index> struct PrintClass<T, Index, typename std::enable_if<Index == Traits<T>::ttype::size() - 1>::type>{ struct PrintClass<T, Index, typename std::enable_if<Index == Traits<T>::ttype::size() - 1>::type>{ static void print(std::ostream& ost, const T &traitedClass){ static void print(std::ostream& ost, const T &traitedClass){ ost << '"' << Traits<T>::ttype::template getName<Traits<T>::ttype::size() - 1>() << "\" : "; ost << '"' << Traits<T>::tr.template getName<Traits<T>::ttype::size() - 1>() << "\" : "; VariableExport::exportVariable(ost, Traits<T>::ttype::template getReference<Traits<T>::ttype::size() - 1>()->getValue(traitedClass)); VariableExport::exportVariable(ost, Traits<T>::tr.template getValue<Traits<T>::tr.size() - 1>(traitedClass)); } } }; }; Loading src/Traits/Traits.h +59 −84 Original line number Original line Diff line number Diff line Loading @@ -6,112 +6,86 @@ #include "../Singleton/Singleton.h" #include "../Singleton/Singleton.h" #include <functional> #include <functional> template<typename Class, typename...Types> template<typename Class, typename...RefTypes> class Traits { class Traits { public: public: template<unsigned int Index> template<unsigned int Index> using type = typename std::tuple_element<Index,std::tuple<Types...>>::type; using refType = typename std::tuple_element<Index,std::tuple<RefTypes...>>::type; template <unsigned int Index> using type = typename MemberReferenceType<refType<Index>>::type; private: private: template<unsigned int Index = sizeof...(Types) - 1, typename Dummy = void> template<unsigned int Index = 0, typename Dummy = void> struct MemRefs: public MemRefs<Index - 1> { struct MemRefs: public MemRefs<Index + 1> { friend class Singleton<MemRefs<1, void>>; std::unique_ptr<MemberApproach<Class, type<Index>>> ref = nullptr; const MemberReference<Class, type<Index>, refType<Index>> ref; std::string name; std::string name; MemRefs(){} template <typename ... REST> MemRefs(std::string n, refType<Index> r, REST... rest) : MemRefs<Index + 1> (rest...), ref(r), name(n){} }; }; template<typename Dummy> template<typename Dummy> struct MemRefs<0, Dummy>{ struct MemRefs<sizeof...(RefTypes) - 1, Dummy>{ friend class Singleton<MemRefs<0, void>>; const MemberReference<Class, type<sizeof...(RefTypes) - 1>, refType<sizeof...(RefTypes) - 1>> ref; std::unique_ptr<MemberApproach<Class, type<0>>> ref = nullptr; std::string name; std::string name; MemRefs(){} MemRefs(std::string n, refType<sizeof...(RefTypes) - 1> r) : ref(r), name(n){} }; }; using refs = Singleton<MemRefs<sizeof... (Types) - 1, void>>; const MemRefs<0, void> refs; template<unsigned int Pos = 0, typename ref, typename...Refs> static void _makeReferences(const std::string& name, ref member,Refs... refsAndNames) { _makeReferences<Pos, ref>(name, member); _makeReferences<Pos+1>(refsAndNames...); } template<unsigned int Pos, typename ref> static void _makeReferences(const std::string& name, ref member) { refs::getInstance().MemRefs<Pos, void>::name = name; refs::getInstance().MemRefs<Pos, void>::ref = std::unique_ptr<MemberApproach<Class, type<Pos>>>(new MemberReference<Class, type<Pos>, ref>(member)); } template<unsigned int Pos, typename ref> static void _makeReferences(const char* name, ref member) { refs::getInstance().MemRefs<Pos, void>::name = name; refs::getInstance().MemRefs<Pos, void>::ref = std::unique_ptr<MemberApproach<Class, type<Pos>>>(new MemberReference<Class, type<Pos>, ref>(member)); } public: public: static constexpr unsigned int size(){ static constexpr unsigned int size(){ return sizeof... (Types); return sizeof... (RefTypes); } } template<unsigned int Index> template<unsigned int Index> static const std::unique_ptr<MemberApproach<Class, type<Index>>>& getReference(){ const MemberReference<Class, type<Index>, refType<Index>>& getReference() const { return refs::getInstance().MemRefs<Index, void>::ref; return refs.MemRefs<Index, void>::ref; } } template<unsigned int Index> template<unsigned int Index> static type<Index> getValue(const Class* c){ type<Index> getValue(const Class* c) const { return getReference<Index>()->getValue(c); return getReference<Index>()->getValue(c); } } template<unsigned int Index> template<unsigned int Index> static type<Index> getValue(const Class& c){ type<Index> getValue(const Class& c) const { return getReference<Index>()->getValue(c); return getReference<Index>().getValue(c); } } template<unsigned int Index> template<unsigned int Index> static void setValue(Class* c, const type<Index>& val){ void setValue(Class* c, const type<Index>& val) const { getReference<Index>()->setValue(c, val); getReference<Index>().setValue(c, val); } } template<unsigned int Index> template<unsigned int Index> static void setValue(Class& c, const type<Index>& val){ void setValue(Class& c, const type<Index>& val) const { getReference<Index>()->setValue(c, val); getReference<Index>().setValue(c, val); } } template<unsigned int Index> template<unsigned int Index> static const std::string& getName(){ const std::string& getName() const { return refs::getInstance().MemRefs<Index, void>::name; return refs.MemRefs<Index, void>::name; } } template<typename...Refs> template<typename...Refs> Traits(Refs... refsAndNames){ Traits(Refs... refsAndNames) : refs(refsAndNames...){} makeReferences(refsAndNames...); } template<typename...Refs> static void makeReferences(Refs... refsAndNames) { _makeReferences<0>(refsAndNames...); } private: private: template<unsigned int Index = 0, typename Dummy = void> template<unsigned int Index = 0, typename Dummy = void> struct Apply { struct Apply { using ThisTrait = Traits<Class, Types...>; using ThisTrait = Traits<Class, RefTypes...>; template <class Functor> template <class Functor> static auto apply (Functor f,...) static auto apply (const ThisTrait& trait, Functor f,...) -> typename std::enable_if<std::is_assignable< -> typename std::enable_if<std::is_assignable< std::function< std::function< void(unsigned int, void(unsigned int, Loading @@ -137,14 +111,14 @@ private: ) ) >, Functor>::value, ""); >, Functor>::value, ""); f(Index, ThisTrait::getReference<Index>(), ThisTrait::getName<Index>()); f(Index, trait.template getReference<Index>(), trait.template getName<Index>()); Apply<Index + 1>::apply(f); Apply<Index + 1>::apply(trait, f); } } template <class Functor> template <class Functor> static auto apply (Functor f) static auto apply (const ThisTrait& trait, Functor f) -> typename std::enable_if<std::is_assignable< -> typename std::enable_if<std::is_assignable< std::function< std::function< void(std::unique_ptr< void(std::unique_ptr< Loading @@ -168,40 +142,40 @@ private: ) ) >, Functor>::value, ""); >, Functor>::value, ""); f(ThisTrait::getReference<Index>(), ThisTrait::getName<Index>()); f(trait.template getReference<Index>(), trait.template getName<Index>()); Apply<Index + 1>::apply(f); Apply<Index + 1>::apply(trait, f); } } template <template <typename, typename>class Functor> template <template <typename, typename>class Functor> static auto apply () static auto apply (const ThisTrait& trait) -> typename std::enable_if<std::is_class<Functor<Class, typename ThisTrait::template type<Index>>>::value>::type -> typename std::enable_if<std::is_class<Functor<Class, typename ThisTrait::template type<Index>>>::value>::type { { static_assert (std::is_assignable< static_assert (std::is_assignable< std::function< std::function< void(unsigned int, void(unsigned int, std::unique_ptr< MemberReference< MemberApproach< Class, Class, typename ThisTrait::template type<Index> typename ThisTrait::template type<Index>, >>&, typename ThisTrait::template refType<Index> >&, const std::string& const std::string& ) ) >, Functor<Class, typename ThisTrait::template type<Index>>>::value, ""); >, Functor<Class, typename ThisTrait::template type<Index>>>::value, ""); Functor<Class, typename ThisTrait::template type<Index>>()(Index, ThisTrait::getReference<Index>(), ThisTrait::getName<Index>()); Functor<Class, typename ThisTrait::template type<Index>>()(Index, trait.template getReference<Index>(), trait.template getName<Index>()); Apply<Index + 1>::template apply<Functor>(); Apply<Index + 1>::template apply<Functor>(trait); } } }; }; template<typename Dummy> template<typename Dummy> struct Apply<size() - 1, Dummy> { struct Apply<size() - 1, Dummy> { using ThisTrait = Traits<Class, Types...>; using ThisTrait = Traits<Class, RefTypes...>; template <class Functor> template <class Functor> static auto apply (Functor f,...) static auto apply (const ThisTrait& trait, Functor f,...) -> typename std::enable_if<std::is_assignable< -> typename std::enable_if<std::is_assignable< std::function< std::function< void(unsigned int, void(unsigned int, Loading @@ -227,14 +201,14 @@ private: ) ) >, Functor>::value, ""); >, Functor>::value, ""); f(ThisTrait::size() - 1, ThisTrait::getReference<ThisTrait::size() - 1>(), ThisTrait::getName<ThisTrait::size() - 1>()); f(trait.size() - 1, trait.template getReference<ThisTrait::size() - 1>(), trait.template getName<ThisTrait::size() - 1>()); } } template <class Functor> template <class Functor> static auto apply (Functor f) static auto apply (const ThisTrait& trait, Functor f) -> typename std::enable_if<std::is_assignable< -> typename std::enable_if<std::is_assignable< std::function< std::function< void(std::unique_ptr< void(std::unique_ptr< Loading @@ -258,29 +232,30 @@ private: ) ) >, Functor>::value, ""); >, Functor>::value, ""); f(ThisTrait::getReference<ThisTrait::size() - 1>(), ThisTrait::getName<ThisTrait::size() - 1>()); f(trait.template getReference<ThisTrait::size() - 1>(), trait.template getName<ThisTrait::size() - 1>()); } } template <template <typename, typename>class Functor> template <template <typename, typename>class Functor> static auto apply () static auto apply (const ThisTrait& trait) -> typename std::enable_if<std::is_class<Functor<Class, typename ThisTrait::template type<ThisTrait::size() - 1>>>::value>::type -> typename std::enable_if<std::is_class<Functor<Class, typename ThisTrait::template type<ThisTrait::size() - 1>>>::value>::type { { static_assert (std::is_assignable< static_assert (std::is_assignable< std::function< std::function< void(unsigned int, void(unsigned int, std::unique_ptr< MemberApproach< MemberReference< Class, Class, typename ThisTrait::template type<ThisTrait::size() - 1> typename ThisTrait::template type<ThisTrait::size() - 1>, >>&, typename ThisTrait::template refType<ThisTrait::size() - 1> >&, const std::string& const std::string& ) ) >, Functor<Class, typename ThisTrait::template type<ThisTrait::size() - 1>>>::value, ""); >, Functor<Class, typename ThisTrait::template type<ThisTrait::size() - 1>>>::value, ""); Functor<Class, typename ThisTrait::template type<ThisTrait::size() - 1>>()(ThisTrait::size() - 1, ThisTrait::getReference<ThisTrait::size() - 1>(), ThisTrait::getName<ThisTrait::size() - 1>()); Functor<Class, typename ThisTrait::template type<ThisTrait::size() - 1>>()(ThisTrait::size() - 1, trait.template getReference<ThisTrait::size() - 1>(), trait.template getName<ThisTrait::size() - 1>()); } } }; }; Loading @@ -294,13 +269,13 @@ public: * const std::string&) * const std::string&) */ */ template<typename Functor> template<typename Functor> static void apply(Functor f) { void apply(Functor f) const { Apply<>::apply(f); Apply<>::apply(*this,f); } } template<template <typename, typename>class Functor> template<template <typename, typename>class Functor> static void apply() { void apply() const { Apply<>::template apply<Functor>(); Apply<>::template apply<Functor>(*this); } } }; }; Loading @@ -320,7 +295,7 @@ public: #include "../Macros/MacroForEach.h" #include "../Macros/MacroForEach.h" #define MEMREF_TYPE_CUSTOM(name, memberRef) typename MemberReferenceType<decltype(memberRef)>::type #define MEMREF_TYPE_CUSTOM(name, memberRef) decltype(memberRef) #define MAKE_CUSTOM_ATTRIBUTE_TRAIT(Class,...)\ #define MAKE_CUSTOM_ATTRIBUTE_TRAIT(Class,...)\ template<> \ template<> \ class Traits<Class>{ \ class Traits<Class>{ \ Loading src/UnstructuredMesh/MeshDataContainer/MeshDataIO/VTKMeshDataReader.h +20 −9 Original line number Original line Diff line number Diff line Loading @@ -29,15 +29,18 @@ class VTKMeshDataReader { >::type >::type { { ist.seekg(dataPositions[Traits<T>::ttype::template getName<Index>()]); ist.seekg(dataPositions[Traits<T>::tr.template getName<Index>()]); std::string line; std::getline(ist, line); ist.seekg(dataPositions[Traits<T>::tr.template getName<Index>()]); typename Traits<T>::ttype::template type<Index> value; typename Traits<T>::ttype::template type<Index> value; for (IndexType i = 0; i < data.size(); i++) { for (IndexType i = 0; i < data.size(); i++) { for (unsigned int j = 0; j < Traits<T>::ttype::template getValue<Index>(data.at(i)).size(); j++){ for (unsigned int j = 0; j < Traits<T>::tr.template getValue<Index>(data.at(i)).size(); j++){ ist >> value[j]; ist >> value[j]; } } Traits<T>::ttype::template setValue<Index>(data.at(i), value); Traits<T>::tr.template setValue<Index>(data.at(i), value); } } } } Loading @@ -57,13 +60,13 @@ class VTKMeshDataReader { typename Traits<T>::ttype::template type<Index> dummy; typename Traits<T>::ttype::template type<Index> dummy; for (IndexType i = 0; i < data.size(); i++) { for (IndexType i = 0; i < data.size(); i++) { for (unsigned int j = 0; j < Traits<T>::ttype::template getValue<Index>(data.at(i)).size(); j++){ for (unsigned int j = 0; j < Traits<T>::tr.template getValue<Index>(data.at(i)).size(); j++){ ist >> value[j]; ist >> value[j]; } } ist >> dummy[0]; ist >> dummy[0]; Traits<T>::ttype::template setValue<Index>(data.at(i), value); Traits<T>::tr.template setValue<Index>(data.at(i), value); } } } } Loading @@ -77,13 +80,13 @@ class VTKMeshDataReader { { { ist.seekg(dataPositions[Traits<T>::ttype::template getName<Index>()]); ist.seekg(dataPositions[Traits<T>::tr.template getName<Index>()]); typename Traits<T>::ttype::template type<Index> value; typename Traits<T>::ttype::template type<Index> value; for (IndexType i = 0; i < data.size(); i++){ for (IndexType i = 0; i < data.size(); i++){ ist >> value; ist >> value; Traits<T>::ttype::template setValue<Index>(data.at(i), value); Traits<T>::tr.template setValue<Index>(data.at(i), value); } } } } Loading @@ -98,7 +101,7 @@ private: static void read(std::istream& ist, DataContainer<T, MeshDimension> &data, std::map<std::string, std::istream::pos_type>& dataPositions){ static void read(std::istream& ist, DataContainer<T, MeshDimension> &data, std::map<std::string, std::istream::pos_type>& dataPositions){ DBGVAR(IsIndexable<typename Traits<T>::ttype::template type<Index>>::value); readColumn<T, Index>(ist, data, dataPositions); readColumn<T, Index>(ist, data, dataPositions); readCellData<Traits<T, Types...>, Index + 1>::read(ist, data, dataPositions); readCellData<Traits<T, Types...>, Index + 1>::read(ist, data, dataPositions); Loading @@ -122,10 +125,16 @@ public: static std::map<std::string, std::istream::pos_type> indexData(std::istream& ist) { static std::map<std::string, std::istream::pos_type> indexData(std::istream& ist) { std::map<std::string, std::istream::pos_type> dataPositions; std::map<std::string, std::istream::pos_type> dataPositions; /* if ((ist.flags() & std::ios::binary) != 0) { std::runtime_error("open the file stream as binary to ensure correct behaviour of tellg"); } */ std::string line; std::string line; ist.seekg(ist.beg); ist.seekg(ist.beg); while(getline(ist, line)) { while(std::getline(ist, line, '\n')) { int flag = (line.find("SCALARS")!= line.npos ? 1 int flag = (line.find("SCALARS")!= line.npos ? 1 : line.find("VECTORS") != line.npos ? 2 : line.find("VECTORS") != line.npos ? 2 : 0 ); : 0 ); Loading @@ -139,7 +148,9 @@ public: ist.ignore(500, '\n'); ist.ignore(500, '\n'); } } dataPositions.insert(std::make_pair(dataName, ist.tellg())); dataPositions.insert(std::make_pair(dataName, ist.tellg())); //ist.seekg(ist.tellg()); } } } } ist.clear(); ist.clear(); Loading Loading
TemplateTest/main.cpp +25 −24 Original line number Original line Diff line number Diff line Loading @@ -298,12 +298,12 @@ void testMemberRef(){ //DBGVAR(Traits<tempData>::ttype::getName<0>()); //DBGVAR(Traits<tempData>::ttype::getName<0>()); Traits<tempData>::ttype::getReference<0>()->setValue(&d, 0.0); Traits<tempData>::tr.getReference<0>().setValue(&d, 0.0); DBGVAR(Traits<tempData>::ttype::getReference<0>()->getValue(&d)); DBGVAR(Traits<tempData>::tr.getReference<0>().getValue(&d)); Traits<tempData>::ttype::getReference<0>()->setValue(d, 42.15); Traits<tempData>::tr.getReference<0>().setValue(d, 42.15); Traits<tempData>::ttype::getReference<1>()->setValue(&d, {42.15,84.30,42.15}); Traits<tempData>::tr.getReference<1>().setValue(&d, {42.15,84.30,42.15}); DBGVAR(Traits<tempData>::ttype::getName<0>(),(Traits<tempData>::ttype::getReference<0>()->getValue(&d)), Traits<tempData>::ttype::getName<1>(),(Traits<tempData, double, Vector<3,double>>::getReference<1>()->getValue(&d)), d.velocity); DBGVAR(Traits<tempData>::tr.getName<0>(),(Traits<tempData>::tr.getReference<0>().getValue(&d)), Traits<tempData>::tr.getName<1>(), d.velocity); DBGVAR(Traits<tempData>::is_specialized,HasDefaultTraits<tempData>::value, d); DBGVAR(Traits<tempData>::is_specialized,HasDefaultTraits<tempData>::value, d); ExportTest e; ExportTest e; Loading @@ -319,7 +319,7 @@ Test of trasposing vector of struct to struct of vectors */ */ template <typename DataType, typename DataTypeTrait = typename Traits<DataType>::ttype> template <typename DataType, typename DataTypeTrait = Traits<DataType>> struct Container{ struct Container{ template <unsigned int index = 0, typename Dummy = void> template <unsigned int index = 0, typename Dummy = void> struct StructOfArrays : public StructOfArrays<index + 1>{ struct StructOfArrays : public StructOfArrays<index + 1>{ Loading @@ -340,7 +340,7 @@ struct Container{ template <unsigned int pos> template <unsigned int pos> const std::string& name() { const std::string& name() { return DataTypeTrait::template getName<pos>(); return Traits<DataType>::tr.template getName<pos>(); } } template <unsigned int pos> template <unsigned int pos> Loading @@ -350,7 +350,6 @@ struct Container{ }; }; void testStructTransposition() { void testStructTransposition() { Container<ExportTest, Traits<ExportTest>::ttype> data; Container<ExportTest, Traits<ExportTest>::ttype> data; Loading @@ -360,6 +359,7 @@ void testStructTransposition() { }; }; /** /** Test TraitApply Test TraitApply */ */ Loading @@ -370,7 +370,7 @@ struct TraitApply { }; }; */ */ /* template < unsigned int index> template < unsigned int index> class TraitApply { class TraitApply { public: public: Loading Loading @@ -505,6 +505,7 @@ public: Functor<ExportTest, Traits<ExportTest>::ttype::type<0>>()(0, Traits<ExportTest>::ttype::getReference<0>(), Traits<ExportTest>::ttype::getName<0>()); Functor<ExportTest, Traits<ExportTest>::ttype::type<0>>()(0, Traits<ExportTest>::ttype::getReference<0>(), Traits<ExportTest>::ttype::getName<0>()); } } }; }; */ struct Depth { struct Depth { int value = 0; int value = 0; Loading @@ -515,19 +516,19 @@ class Func { public: public: template <typename U = T> template <typename U = T> auto operator()(unsigned int index, const std::unique_ptr<MemberApproach<Class, T>>&, const std::string& name) auto operator()(unsigned int index, const MemberApproach<Class, T>&, const std::string& name) -> typename std::enable_if<!(HasDefaultTraits<U>::value)>::type -> typename std::enable_if<!(HasDefaultTraits<U>::value)>::type { { DBGVAR(Singleton<Depth>::getInstance().value,index, name); DBGVAR(Singleton<Depth>::getInstance().value,index, name); } } template <typename U = T> template <typename U = T> auto operator()(unsigned int index, const std::unique_ptr<MemberApproach<Class, T>>&, const std::string& name) auto operator()(unsigned int index, const MemberApproach<Class, T>&, const std::string& name) -> typename std::enable_if<HasDefaultTraits<U>::value>::type -> typename std::enable_if<HasDefaultTraits<U>::value>::type { { DBGVAR(Singleton<Depth>::getInstance().value,index, name); DBGVAR(Singleton<Depth>::getInstance().value,index, name); Singleton<Depth>::getInstance().value++; Singleton<Depth>::getInstance().value++; Traits<T>::ttype::template apply<Func>(); Traits<T>::tr.template apply<Func>(); Singleton<Depth>::getInstance().value--; Singleton<Depth>::getInstance().value--; } } }; }; Loading @@ -540,18 +541,18 @@ void testTraitApply() { DBGVAR(std::is_function<decltype (lambda)>::value); DBGVAR(std::is_function<decltype (lambda)>::value); TraitApply<5>::apply(lambda); //TraitApply<5>::apply(lambda); auto lambda1 = []( auto& , const std::string& name){DBGVAR(name);}; auto lambda1 = []( auto& , const std::string& name){DBGVAR(name);}; TraitApply<5>::apply(lambda1); //TraitApply<5>::apply(lambda1); DBGMSG("Tady"); DBGMSG("Tady"); Traits<ExportTest>::ttype::apply<Func>(); Traits<ExportTest>::tr.apply<Func>(); //TraitApply<5>::apply<Func>(); //TraitApply<5>::apply<Func>(); Traits<ExportTest>::ttype::apply(lambda); Traits<ExportTest>::tr.apply(lambda); Traits<ExportTest>::ttype::apply(lambda1); Traits<ExportTest>::tr.apply(lambda1); //Traits<ExportTest>::ttype::apply<Func>(); //Traits<ExportTest>::ttype::apply<Func>(); Loading @@ -561,7 +562,7 @@ DBGMSG("Tady"); /* /* * * * Compile time traits * Compile time traits DONE */ */ #include <cstdio> #include <cstdio> Loading Loading @@ -863,7 +864,7 @@ private: template<unsigned int Index = 0, typename Dummy = void> template<unsigned int Index = 0, typename Dummy = void> struct MemRefs: public MemRefs<Index + 1> { struct MemRefs: public MemRefs<Index + 1> { const TestMemberReference<Class, type<Index>, refType<Index>> ref; const MemberReference<Class, type<Index>, refType<Index>> ref; std::string name; std::string name; template <typename ... REST> template <typename ... REST> Loading @@ -872,7 +873,7 @@ private: template<typename Dummy> template<typename Dummy> struct MemRefs<sizeof...(RefTypes) - 1, Dummy>{ struct MemRefs<sizeof...(RefTypes) - 1, Dummy>{ const TestMemberReference<Class, type<sizeof...(RefTypes) - 1>, refType<sizeof...(RefTypes) - 1>> ref; const MemberReference<Class, type<sizeof...(RefTypes) - 1>, refType<sizeof...(RefTypes) - 1>> ref; std::string name; std::string name; MemRefs(std::string n, refType<sizeof...(RefTypes) - 1> r) : ref(r), name(n){} MemRefs(std::string n, refType<sizeof...(RefTypes) - 1> r) : ref(r), name(n){} Loading Loading @@ -912,7 +913,7 @@ public: template<unsigned int Index> template<unsigned int Index> const TestMemberReference<Class, type<Index>, refType<Index>>& getReference(){ const MemberReference<Class, type<Index>, refType<Index>>& getReference(){ return refs.MemRefs<Index, void>::ref; return refs.MemRefs<Index, void>::ref; } } Loading Loading @@ -1145,7 +1146,7 @@ void testTraitPerformance() { res = 0; res = 0; for(int rep = 0; rep < maxRep; rep++){ for(int rep = 0; rep < maxRep; rep++){ for(size_t i = 0; i < vec.size(); i++) { for(size_t i = 0; i < vec.size(); i++) { res += Traits<ExportTest>::ttype::getValue<1>(vec[i]); res += Traits<ExportTest>::tr.getValue<1>(vec[i]); } } duration += (clock.now() - start).count(); duration += (clock.now() - start).count(); deviation += (clock.now() - start).count() * (clock.now() - start).count(); deviation += (clock.now() - start).count() * (clock.now() - start).count(); Loading Loading @@ -1300,7 +1301,7 @@ MAKE_NAMED_ATTRIBUTE_TRAIT(privateAttr, "str_attr", attr); void testPrivateTrait(){ void testPrivateTrait(){ privateAttr a; privateAttr a; DBGVAR(a); DBGVAR(a); Traits<privateAttr>::ttype::setValue<0>(a, "new value"); Traits<privateAttr>::tr.setValue<0>(a, "new value"); DBGVAR(a); DBGVAR(a); } } Loading Loading @@ -1471,7 +1472,7 @@ int main() //testStructTransposition(); //testStructTransposition(); //testTraitApply(); //testTraitApply(); //testCompileTimeTraits(); //testCompileTimeTraits(); testTraitPerformance(); //testTraitPerformance(); //testCustomUnorderedMap(); //testCustomUnorderedMap(); //testPrivateTrait(); //testPrivateTrait(); //testJson(); //testJson(); Loading
Unstructured_mesh/main.cpp +4 −4 Original line number Original line Diff line number Diff line Loading @@ -661,7 +661,7 @@ struct colourData { Vector<3, double> firstEdgeNormal; Vector<3, double> firstEdgeNormal; }; }; MAKE_ATTRIBUTE_TRAIT(colourData, colour, firstEdgeNormal); MAKE_ATTRIBUTE_TRAIT(colourData, firstEdgeNormal, colour); void testMeshRefine() { void testMeshRefine() { UnstructuredMesh<3, size_t, double, 6> mesh; UnstructuredMesh<3, size_t, double, 6> mesh; Loading Loading @@ -722,7 +722,7 @@ void testMeshRefine() { ifstream in3D; ifstream in3D; in3D.open("mesh_refine_1.vtk"); in3D.open("mesh_refine_1.vtk", std::ios::binary); VTKMeshReader<3> reader; VTKMeshReader<3> reader; reader.loadFromStream(in3D, mesh); reader.loadFromStream(in3D, mesh); Loading Loading @@ -1019,9 +1019,9 @@ int main() //meshSize(); //meshSize(); //testMesh2D(); //testMesh2D(); //testMesh2DLoadAndWrite(); //testMesh2DLoadAndWrite(); testMesh3D(); //testMesh3D(); //test3DMeshDeformedPrisms(); //test3DMeshDeformedPrisms(); //testMeshRefine(); testMeshRefine(); //testMeshDataContainer(); //testMeshDataContainer(); //UnstructuredMesh<5, size_t, double, 6,5,4> m; //UnstructuredMesh<5, size_t, double, 6,5,4> m; //m.ComputeElementMeasures(); //m.ComputeElementMeasures(); Loading
src/Debug/VariableExport.h +10 −10 Original line number Original line Diff line number Diff line Loading @@ -153,8 +153,8 @@ struct VariableExport { template<typename T,unsigned int Index = 0, typename Void = void> template<typename T,unsigned int Index = 0, typename Void = void> struct PrintClass{ struct PrintClass{ static void print(std::ostream& ost, const T &traitedClass){ static void print(std::ostream& ost, const T &traitedClass){ ost << '"' << Traits<T>::ttype::template getName<Index>() << "\" : "; ost << '"' << Traits<T>::tr.template getName<Index>() << "\" : "; VariableExport::exportVariable(ost, Traits<T>::ttype::template getReference<Index>()->getValue(traitedClass)); VariableExport::exportVariable(ost, Traits<T>::tr.template getValue<Index>(traitedClass)); ost << ", "; ost << ", "; PrintClass<T, Index + 1>::print(ost, traitedClass); PrintClass<T, Index + 1>::print(ost, traitedClass); Loading @@ -163,9 +163,9 @@ struct VariableExport { template<typename T,unsigned int Index, typename... Types> template<typename T,unsigned int Index, typename... Types> struct PrintClass <Traits<T, Types...>, Index, typename std::enable_if<Index < Traits<T, Types...>::size() - 1>::type>{ struct PrintClass <Traits<T, Types...>, Index, typename std::enable_if<Index < Traits<T, Types...>::size() - 1>::type>{ static void print(std::ostream& ost, const T &traitedClass){ static void print(std::ostream& ost, const T &traitedClass, const Traits<T, Types...>& trait = Traits<T>::tr){ ost << '"' << Traits<T, Types...>::template getName<Index>() << "\" : "; ost << '"' << trait.template getName<Index>() << "\" : "; VariableExport::exportVariable(ost, Traits<T, Types...>::template getReference<Index>()->getValue(traitedClass)); VariableExport::exportVariable(ost, trait.template getValue<Index>(traitedClass)); ost << ", "; ost << ", "; PrintClass<Traits<T, Types...>, Index + 1>::print(ost, traitedClass); PrintClass<Traits<T, Types...>, Index + 1>::print(ost, traitedClass); Loading @@ -174,17 +174,17 @@ struct VariableExport { template<typename T,unsigned int Index, typename ... Types> template<typename T,unsigned int Index, typename ... Types> struct PrintClass <Traits<T, Types...>, Index, typename std::enable_if<Index == Traits<T, Types...>::size() - 1>::type>{ struct PrintClass <Traits<T, Types...>, Index, typename std::enable_if<Index == Traits<T, Types...>::size() - 1>::type>{ static void print(std::ostream& ost, const T &traitedClass){ static void print(std::ostream& ost, const T &traitedClass, const Traits<T, Types...>& trait = Traits<T>::tr){ ost << '"' << Traits<T, Types...>::template getName<Traits<T, Types...>::size() - 1>() << "\" : "; ost << '"' << trait.template getName<Traits<T, Types...>::size() - 1>() << "\" : "; VariableExport::exportVariable(ost, Traits<T, Types...>::template getReference<Traits<T, Types...>::size() - 1>()->getValue(traitedClass)); VariableExport::exportVariable(ost, trait.template getValue<Traits<T, Types...>::size() - 1>(traitedClass)); } } }; }; template<typename T, unsigned int Index> template<typename T, unsigned int Index> struct PrintClass<T, Index, typename std::enable_if<Index == Traits<T>::ttype::size() - 1>::type>{ struct PrintClass<T, Index, typename std::enable_if<Index == Traits<T>::ttype::size() - 1>::type>{ static void print(std::ostream& ost, const T &traitedClass){ static void print(std::ostream& ost, const T &traitedClass){ ost << '"' << Traits<T>::ttype::template getName<Traits<T>::ttype::size() - 1>() << "\" : "; ost << '"' << Traits<T>::tr.template getName<Traits<T>::ttype::size() - 1>() << "\" : "; VariableExport::exportVariable(ost, Traits<T>::ttype::template getReference<Traits<T>::ttype::size() - 1>()->getValue(traitedClass)); VariableExport::exportVariable(ost, Traits<T>::tr.template getValue<Traits<T>::tr.size() - 1>(traitedClass)); } } }; }; Loading
src/Traits/Traits.h +59 −84 Original line number Original line Diff line number Diff line Loading @@ -6,112 +6,86 @@ #include "../Singleton/Singleton.h" #include "../Singleton/Singleton.h" #include <functional> #include <functional> template<typename Class, typename...Types> template<typename Class, typename...RefTypes> class Traits { class Traits { public: public: template<unsigned int Index> template<unsigned int Index> using type = typename std::tuple_element<Index,std::tuple<Types...>>::type; using refType = typename std::tuple_element<Index,std::tuple<RefTypes...>>::type; template <unsigned int Index> using type = typename MemberReferenceType<refType<Index>>::type; private: private: template<unsigned int Index = sizeof...(Types) - 1, typename Dummy = void> template<unsigned int Index = 0, typename Dummy = void> struct MemRefs: public MemRefs<Index - 1> { struct MemRefs: public MemRefs<Index + 1> { friend class Singleton<MemRefs<1, void>>; std::unique_ptr<MemberApproach<Class, type<Index>>> ref = nullptr; const MemberReference<Class, type<Index>, refType<Index>> ref; std::string name; std::string name; MemRefs(){} template <typename ... REST> MemRefs(std::string n, refType<Index> r, REST... rest) : MemRefs<Index + 1> (rest...), ref(r), name(n){} }; }; template<typename Dummy> template<typename Dummy> struct MemRefs<0, Dummy>{ struct MemRefs<sizeof...(RefTypes) - 1, Dummy>{ friend class Singleton<MemRefs<0, void>>; const MemberReference<Class, type<sizeof...(RefTypes) - 1>, refType<sizeof...(RefTypes) - 1>> ref; std::unique_ptr<MemberApproach<Class, type<0>>> ref = nullptr; std::string name; std::string name; MemRefs(){} MemRefs(std::string n, refType<sizeof...(RefTypes) - 1> r) : ref(r), name(n){} }; }; using refs = Singleton<MemRefs<sizeof... (Types) - 1, void>>; const MemRefs<0, void> refs; template<unsigned int Pos = 0, typename ref, typename...Refs> static void _makeReferences(const std::string& name, ref member,Refs... refsAndNames) { _makeReferences<Pos, ref>(name, member); _makeReferences<Pos+1>(refsAndNames...); } template<unsigned int Pos, typename ref> static void _makeReferences(const std::string& name, ref member) { refs::getInstance().MemRefs<Pos, void>::name = name; refs::getInstance().MemRefs<Pos, void>::ref = std::unique_ptr<MemberApproach<Class, type<Pos>>>(new MemberReference<Class, type<Pos>, ref>(member)); } template<unsigned int Pos, typename ref> static void _makeReferences(const char* name, ref member) { refs::getInstance().MemRefs<Pos, void>::name = name; refs::getInstance().MemRefs<Pos, void>::ref = std::unique_ptr<MemberApproach<Class, type<Pos>>>(new MemberReference<Class, type<Pos>, ref>(member)); } public: public: static constexpr unsigned int size(){ static constexpr unsigned int size(){ return sizeof... (Types); return sizeof... (RefTypes); } } template<unsigned int Index> template<unsigned int Index> static const std::unique_ptr<MemberApproach<Class, type<Index>>>& getReference(){ const MemberReference<Class, type<Index>, refType<Index>>& getReference() const { return refs::getInstance().MemRefs<Index, void>::ref; return refs.MemRefs<Index, void>::ref; } } template<unsigned int Index> template<unsigned int Index> static type<Index> getValue(const Class* c){ type<Index> getValue(const Class* c) const { return getReference<Index>()->getValue(c); return getReference<Index>()->getValue(c); } } template<unsigned int Index> template<unsigned int Index> static type<Index> getValue(const Class& c){ type<Index> getValue(const Class& c) const { return getReference<Index>()->getValue(c); return getReference<Index>().getValue(c); } } template<unsigned int Index> template<unsigned int Index> static void setValue(Class* c, const type<Index>& val){ void setValue(Class* c, const type<Index>& val) const { getReference<Index>()->setValue(c, val); getReference<Index>().setValue(c, val); } } template<unsigned int Index> template<unsigned int Index> static void setValue(Class& c, const type<Index>& val){ void setValue(Class& c, const type<Index>& val) const { getReference<Index>()->setValue(c, val); getReference<Index>().setValue(c, val); } } template<unsigned int Index> template<unsigned int Index> static const std::string& getName(){ const std::string& getName() const { return refs::getInstance().MemRefs<Index, void>::name; return refs.MemRefs<Index, void>::name; } } template<typename...Refs> template<typename...Refs> Traits(Refs... refsAndNames){ Traits(Refs... refsAndNames) : refs(refsAndNames...){} makeReferences(refsAndNames...); } template<typename...Refs> static void makeReferences(Refs... refsAndNames) { _makeReferences<0>(refsAndNames...); } private: private: template<unsigned int Index = 0, typename Dummy = void> template<unsigned int Index = 0, typename Dummy = void> struct Apply { struct Apply { using ThisTrait = Traits<Class, Types...>; using ThisTrait = Traits<Class, RefTypes...>; template <class Functor> template <class Functor> static auto apply (Functor f,...) static auto apply (const ThisTrait& trait, Functor f,...) -> typename std::enable_if<std::is_assignable< -> typename std::enable_if<std::is_assignable< std::function< std::function< void(unsigned int, void(unsigned int, Loading @@ -137,14 +111,14 @@ private: ) ) >, Functor>::value, ""); >, Functor>::value, ""); f(Index, ThisTrait::getReference<Index>(), ThisTrait::getName<Index>()); f(Index, trait.template getReference<Index>(), trait.template getName<Index>()); Apply<Index + 1>::apply(f); Apply<Index + 1>::apply(trait, f); } } template <class Functor> template <class Functor> static auto apply (Functor f) static auto apply (const ThisTrait& trait, Functor f) -> typename std::enable_if<std::is_assignable< -> typename std::enable_if<std::is_assignable< std::function< std::function< void(std::unique_ptr< void(std::unique_ptr< Loading @@ -168,40 +142,40 @@ private: ) ) >, Functor>::value, ""); >, Functor>::value, ""); f(ThisTrait::getReference<Index>(), ThisTrait::getName<Index>()); f(trait.template getReference<Index>(), trait.template getName<Index>()); Apply<Index + 1>::apply(f); Apply<Index + 1>::apply(trait, f); } } template <template <typename, typename>class Functor> template <template <typename, typename>class Functor> static auto apply () static auto apply (const ThisTrait& trait) -> typename std::enable_if<std::is_class<Functor<Class, typename ThisTrait::template type<Index>>>::value>::type -> typename std::enable_if<std::is_class<Functor<Class, typename ThisTrait::template type<Index>>>::value>::type { { static_assert (std::is_assignable< static_assert (std::is_assignable< std::function< std::function< void(unsigned int, void(unsigned int, std::unique_ptr< MemberReference< MemberApproach< Class, Class, typename ThisTrait::template type<Index> typename ThisTrait::template type<Index>, >>&, typename ThisTrait::template refType<Index> >&, const std::string& const std::string& ) ) >, Functor<Class, typename ThisTrait::template type<Index>>>::value, ""); >, Functor<Class, typename ThisTrait::template type<Index>>>::value, ""); Functor<Class, typename ThisTrait::template type<Index>>()(Index, ThisTrait::getReference<Index>(), ThisTrait::getName<Index>()); Functor<Class, typename ThisTrait::template type<Index>>()(Index, trait.template getReference<Index>(), trait.template getName<Index>()); Apply<Index + 1>::template apply<Functor>(); Apply<Index + 1>::template apply<Functor>(trait); } } }; }; template<typename Dummy> template<typename Dummy> struct Apply<size() - 1, Dummy> { struct Apply<size() - 1, Dummy> { using ThisTrait = Traits<Class, Types...>; using ThisTrait = Traits<Class, RefTypes...>; template <class Functor> template <class Functor> static auto apply (Functor f,...) static auto apply (const ThisTrait& trait, Functor f,...) -> typename std::enable_if<std::is_assignable< -> typename std::enable_if<std::is_assignable< std::function< std::function< void(unsigned int, void(unsigned int, Loading @@ -227,14 +201,14 @@ private: ) ) >, Functor>::value, ""); >, Functor>::value, ""); f(ThisTrait::size() - 1, ThisTrait::getReference<ThisTrait::size() - 1>(), ThisTrait::getName<ThisTrait::size() - 1>()); f(trait.size() - 1, trait.template getReference<ThisTrait::size() - 1>(), trait.template getName<ThisTrait::size() - 1>()); } } template <class Functor> template <class Functor> static auto apply (Functor f) static auto apply (const ThisTrait& trait, Functor f) -> typename std::enable_if<std::is_assignable< -> typename std::enable_if<std::is_assignable< std::function< std::function< void(std::unique_ptr< void(std::unique_ptr< Loading @@ -258,29 +232,30 @@ private: ) ) >, Functor>::value, ""); >, Functor>::value, ""); f(ThisTrait::getReference<ThisTrait::size() - 1>(), ThisTrait::getName<ThisTrait::size() - 1>()); f(trait.template getReference<ThisTrait::size() - 1>(), trait.template getName<ThisTrait::size() - 1>()); } } template <template <typename, typename>class Functor> template <template <typename, typename>class Functor> static auto apply () static auto apply (const ThisTrait& trait) -> typename std::enable_if<std::is_class<Functor<Class, typename ThisTrait::template type<ThisTrait::size() - 1>>>::value>::type -> typename std::enable_if<std::is_class<Functor<Class, typename ThisTrait::template type<ThisTrait::size() - 1>>>::value>::type { { static_assert (std::is_assignable< static_assert (std::is_assignable< std::function< std::function< void(unsigned int, void(unsigned int, std::unique_ptr< MemberApproach< MemberReference< Class, Class, typename ThisTrait::template type<ThisTrait::size() - 1> typename ThisTrait::template type<ThisTrait::size() - 1>, >>&, typename ThisTrait::template refType<ThisTrait::size() - 1> >&, const std::string& const std::string& ) ) >, Functor<Class, typename ThisTrait::template type<ThisTrait::size() - 1>>>::value, ""); >, Functor<Class, typename ThisTrait::template type<ThisTrait::size() - 1>>>::value, ""); Functor<Class, typename ThisTrait::template type<ThisTrait::size() - 1>>()(ThisTrait::size() - 1, ThisTrait::getReference<ThisTrait::size() - 1>(), ThisTrait::getName<ThisTrait::size() - 1>()); Functor<Class, typename ThisTrait::template type<ThisTrait::size() - 1>>()(ThisTrait::size() - 1, trait.template getReference<ThisTrait::size() - 1>(), trait.template getName<ThisTrait::size() - 1>()); } } }; }; Loading @@ -294,13 +269,13 @@ public: * const std::string&) * const std::string&) */ */ template<typename Functor> template<typename Functor> static void apply(Functor f) { void apply(Functor f) const { Apply<>::apply(f); Apply<>::apply(*this,f); } } template<template <typename, typename>class Functor> template<template <typename, typename>class Functor> static void apply() { void apply() const { Apply<>::template apply<Functor>(); Apply<>::template apply<Functor>(*this); } } }; }; Loading @@ -320,7 +295,7 @@ public: #include "../Macros/MacroForEach.h" #include "../Macros/MacroForEach.h" #define MEMREF_TYPE_CUSTOM(name, memberRef) typename MemberReferenceType<decltype(memberRef)>::type #define MEMREF_TYPE_CUSTOM(name, memberRef) decltype(memberRef) #define MAKE_CUSTOM_ATTRIBUTE_TRAIT(Class,...)\ #define MAKE_CUSTOM_ATTRIBUTE_TRAIT(Class,...)\ template<> \ template<> \ class Traits<Class>{ \ class Traits<Class>{ \ Loading
src/UnstructuredMesh/MeshDataContainer/MeshDataIO/VTKMeshDataReader.h +20 −9 Original line number Original line Diff line number Diff line Loading @@ -29,15 +29,18 @@ class VTKMeshDataReader { >::type >::type { { ist.seekg(dataPositions[Traits<T>::ttype::template getName<Index>()]); ist.seekg(dataPositions[Traits<T>::tr.template getName<Index>()]); std::string line; std::getline(ist, line); ist.seekg(dataPositions[Traits<T>::tr.template getName<Index>()]); typename Traits<T>::ttype::template type<Index> value; typename Traits<T>::ttype::template type<Index> value; for (IndexType i = 0; i < data.size(); i++) { for (IndexType i = 0; i < data.size(); i++) { for (unsigned int j = 0; j < Traits<T>::ttype::template getValue<Index>(data.at(i)).size(); j++){ for (unsigned int j = 0; j < Traits<T>::tr.template getValue<Index>(data.at(i)).size(); j++){ ist >> value[j]; ist >> value[j]; } } Traits<T>::ttype::template setValue<Index>(data.at(i), value); Traits<T>::tr.template setValue<Index>(data.at(i), value); } } } } Loading @@ -57,13 +60,13 @@ class VTKMeshDataReader { typename Traits<T>::ttype::template type<Index> dummy; typename Traits<T>::ttype::template type<Index> dummy; for (IndexType i = 0; i < data.size(); i++) { for (IndexType i = 0; i < data.size(); i++) { for (unsigned int j = 0; j < Traits<T>::ttype::template getValue<Index>(data.at(i)).size(); j++){ for (unsigned int j = 0; j < Traits<T>::tr.template getValue<Index>(data.at(i)).size(); j++){ ist >> value[j]; ist >> value[j]; } } ist >> dummy[0]; ist >> dummy[0]; Traits<T>::ttype::template setValue<Index>(data.at(i), value); Traits<T>::tr.template setValue<Index>(data.at(i), value); } } } } Loading @@ -77,13 +80,13 @@ class VTKMeshDataReader { { { ist.seekg(dataPositions[Traits<T>::ttype::template getName<Index>()]); ist.seekg(dataPositions[Traits<T>::tr.template getName<Index>()]); typename Traits<T>::ttype::template type<Index> value; typename Traits<T>::ttype::template type<Index> value; for (IndexType i = 0; i < data.size(); i++){ for (IndexType i = 0; i < data.size(); i++){ ist >> value; ist >> value; Traits<T>::ttype::template setValue<Index>(data.at(i), value); Traits<T>::tr.template setValue<Index>(data.at(i), value); } } } } Loading @@ -98,7 +101,7 @@ private: static void read(std::istream& ist, DataContainer<T, MeshDimension> &data, std::map<std::string, std::istream::pos_type>& dataPositions){ static void read(std::istream& ist, DataContainer<T, MeshDimension> &data, std::map<std::string, std::istream::pos_type>& dataPositions){ DBGVAR(IsIndexable<typename Traits<T>::ttype::template type<Index>>::value); readColumn<T, Index>(ist, data, dataPositions); readColumn<T, Index>(ist, data, dataPositions); readCellData<Traits<T, Types...>, Index + 1>::read(ist, data, dataPositions); readCellData<Traits<T, Types...>, Index + 1>::read(ist, data, dataPositions); Loading @@ -122,10 +125,16 @@ public: static std::map<std::string, std::istream::pos_type> indexData(std::istream& ist) { static std::map<std::string, std::istream::pos_type> indexData(std::istream& ist) { std::map<std::string, std::istream::pos_type> dataPositions; std::map<std::string, std::istream::pos_type> dataPositions; /* if ((ist.flags() & std::ios::binary) != 0) { std::runtime_error("open the file stream as binary to ensure correct behaviour of tellg"); } */ std::string line; std::string line; ist.seekg(ist.beg); ist.seekg(ist.beg); while(getline(ist, line)) { while(std::getline(ist, line, '\n')) { int flag = (line.find("SCALARS")!= line.npos ? 1 int flag = (line.find("SCALARS")!= line.npos ? 1 : line.find("VECTORS") != line.npos ? 2 : line.find("VECTORS") != line.npos ? 2 : 0 ); : 0 ); Loading @@ -139,7 +148,9 @@ public: ist.ignore(500, '\n'); ist.ignore(500, '\n'); } } dataPositions.insert(std::make_pair(dataName, ist.tellg())); dataPositions.insert(std::make_pair(dataName, ist.tellg())); //ist.seekg(ist.tellg()); } } } } ist.clear(); ist.clear(); Loading