Loading TemplateTest/main.cpp +59 −54 Original line number Diff line number Diff line Loading @@ -291,12 +291,12 @@ struct tempData { /* template<> class Traits<tempData>{ class DefaultTraits<tempData>{ public: using ttype = Traits<tempData, double, Vector<3,double>>; const static ttype tr; }; const Traits<tempData>::ttype Traits<tempData>::tr("density", &tempData::density, "momentum"s, std::make_pair(&tempData::getMomentum, &tempData::setMomentum)); const DefaultTraits<tempData>::ttype DefaultTraits<tempData>::tr("density", &tempData::density, "momentum"s, std::make_pair(&tempData::getMomentum, &tempData::setMomentum)); */ Loading @@ -306,7 +306,7 @@ const Traits<tempData>::ttype Traits<tempData>::tr("density", &tempData::density MAKE_CUSTOM_TRAIT(tempData, "density", &tempData::density, "momentum", std::make_pair(&tempData::getMomentum, &tempData::setMomentum)); /* template<> class Traits<tempData>{ class DefaultTraits<tempData>{ public: using traitsType = ::Traits<Class, double tempData::*, decltype(std::make_pair(&tempData::getMomentum, &tempData::setMomentum))>; static const traitsType getTraits() {return traitsType( "density", &tempData::density, "momentum", std::make_pair(&tempData::getMomentum, &tempData::setMomentum));} Loading Loading @@ -360,12 +360,12 @@ struct testData { /* template<> class Traits<tempData>{ class DefaultTraits<tempData>{ public: using ttype = Traits<tempData, double, Vector<3,double>>; const static ttype tr; }; const Traits<tempData>::ttype Traits<tempData>::tr("density", &tempData::density, "momentum"s, std::make_pair(&tempData::getMomentum, &tempData::setMomentum)); const DefaultTraits<tempData>::ttype DefaultTraits<tempData>::tr("density", &tempData::density, "momentum"s, std::make_pair(&tempData::getMomentum, &tempData::setMomentum)); */ Loading @@ -380,14 +380,14 @@ void testMemberRef(){ tempData d; //DBGVAR(Traits<tempData>::ttype::getName<0>()); //DBGVAR(DefaultTraits<tempData>::ttype::getName<0>()); Traits<tempData>::getTraits().getReference<0>().setValue(&d, 0.0); DBGVAR(Traits<tempData>::getTraits().getReference<0>().getValue(&d)); Traits<tempData>::getTraits().getReference<0>().setValue(d, 42.15); Traits<tempData>::getTraits().getReference<1>().setValue(&d, {42.15,84.30,42.15}); DefaultTraits<tempData>::getTraits().getReference<0>().setValue(&d, 0.0); DBGVAR(DefaultTraits<tempData>::getTraits().getReference<0>().getValue(&d)); DefaultTraits<tempData>::getTraits().getReference<0>().setValue(d, 42.15); DefaultTraits<tempData>::getTraits().getReference<1>().setValue(&d, {42.15,84.30,42.15}); DBGVAR(Traits<tempData>::getTraits().getName<0>(),(Traits<tempData>::getTraits().getReference<0>().getValue(&d)), Traits<tempData>::getTraits().getName<1>(), d.velocity); DBGVAR(DefaultTraits<tempData>::getTraits().getName<0>(),(DefaultTraits<tempData>::getTraits().getReference<0>().getValue(&d)), DefaultTraits<tempData>::getTraits().getName<1>(), d.velocity); DBGVAR(HasDefaultTraits<tempData>::value, d); Traits<tempData, decltype(&tempData::getData)> trait("density", &tempData::getData); Loading Loading @@ -437,7 +437,7 @@ public: explicit TraitedClass() {DBGMSG("TC construtor");} //TraitedClass(const TraitedClass& rhs) = default; //TraitedClass(TraitedClass&&) = default; friend class Traits<TraitedClass>; friend class DefaultTraits<TraitedClass>; template<unsigned int... Idxs> auto& operator[](integer_sequence<unsigned int, Idxs...>){ Loading @@ -452,6 +452,7 @@ MAKE_ATTRIBUTE_TRAIT(ns::TraitedClass, d1, d2, ts); template <typename T> auto sum(const T& val){ DBGVAR(val); return TraitsAggregationProcesor<BinaryPlus>::evaluate(val); } Loading @@ -459,6 +460,10 @@ void testTraitsAlgorithms() { ExportTest e1, e2; ExportTest res = e1 + e2; std::vector<ExportTest> vec(40, ExportTest()); DBGVAR(std::make_pair(e1, DefaultArithmeticTraits<ExportTest>::getTraits())); DBGVAR(std::make_pair(e1.attrTempData, DefaultArithmeticTraits<tempData>::getTraits())); DBGVAR(sum(e1)); DBGVAR(2.45*e1,e1 + e2, e1, e2,HasDefaultArithmeticTraits<int>::value, max(e2), min(e2), max(vec)); Loading Loading @@ -1151,7 +1156,7 @@ void testNumericTraitsPerformance() { DBGMSG("Traits approach instead of numeric traits +="); Traits<NumStruct2> t; DefaultTraits<NumStruct2> t; start = clock.now(); res2 = NumStruct2({0,0}); for(int rep = 0; rep < maxRep; rep++){ Loading Loading @@ -1266,7 +1271,7 @@ Test of trasposing vector of struct to struct of vectors */ template <typename DataType, typename DataTypeTrait = Traits<DataType>> template <typename DataType, typename DataTypeTrait = DefaultTraits<DataType>> struct Container{ template <unsigned int index = 0, typename Dummy = void> struct StructOfArrays : public StructOfArrays<index + 1>{ Loading @@ -1275,7 +1280,7 @@ struct Container{ template <typename Dummy> struct StructOfArrays<Traits<DataType>::traitsType::size() - 1, Dummy>{ struct StructOfArrays<DefaultTraits<DataType>::traitsType::size() - 1, Dummy>{ std::vector<typename DataTypeTrait::template type<DataTypeTrait::size() - 1>> vec; }; Loading @@ -1287,18 +1292,18 @@ struct Container{ template <unsigned int pos> const char* name() { return Traits<DataType>::getTraits().template getName<pos>(); return DefaultTraits<DataType>::getTraits().template getName<pos>(); } template <unsigned int pos> std::vector<typename Traits<DataType>::traitsType::template type<pos>>& getDataAtPos() { std::vector<typename DefaultTraits<DataType>::traitsType::template type<pos>>& getDataAtPos() { return data.StructOfArrays<pos>::vec; } }; void testStructTransposition() { Container<ExportTest, Traits<ExportTest>::traitsType> data; Container<ExportTest, DefaultTraits<ExportTest>::traitsType> data; data.getDataAtPos<5>().resize(2); DBGVAR(data.size(), data.getDataAtPos<5>(), data.name<5>()); Loading Loading @@ -1329,7 +1334,7 @@ public: std::unique_ptr< MemberApproach< ExportTest, Traits<ExportTest>::ttype::type<index> DefaultTraits<ExportTest>::ttype::type<index> >>&, const std::string& ) Loading @@ -1342,13 +1347,13 @@ public: std::unique_ptr< MemberApproach< ExportTest, Traits<ExportTest>::ttype::type<index> DefaultTraits<ExportTest>::ttype::type<index> >>&, const std::string& ) >, Functor>, ""); f(index, Traits<ExportTest>::ttype::getReference<index>(), Traits<ExportTest>::ttype::getName<index>()); f(index, DefaultTraits<ExportTest>::ttype::getReference<index>(), DefaultTraits<ExportTest>::ttype::getName<index>()); TraitApply<index - 1>::apply(f); } Loading @@ -1361,7 +1366,7 @@ public: void(std::unique_ptr< MemberApproach< ExportTest, Traits<ExportTest>::ttype::type<index> DefaultTraits<ExportTest>::ttype::type<index> >>&, const std::string& ) Loading @@ -1373,19 +1378,19 @@ public: void(std::unique_ptr< MemberApproach< ExportTest, Traits<ExportTest>::ttype::type<index> DefaultTraits<ExportTest>::ttype::type<index> >>&, const std::string& ) >, Functor>, ""); f(Traits<ExportTest>::ttype::getReference<index>(), Traits<ExportTest>::ttype::getName<index>()); f(DefaultTraits<ExportTest>::ttype::getReference<index>(), DefaultTraits<ExportTest>::ttype::getName<index>()); TraitApply<index - 1>::apply(f); } template <template <typename, typename>class Functor> static auto apply () -> typename std::enable_if<std::is_class<Functor<ExportTest, Traits<ExportTest>::ttype::type<index>>>::value>::type -> typename std::enable_if<std::is_class<Functor<ExportTest, DefaultTraits<ExportTest>::ttype::type<index>>>::value>::type { static_assert (std::is_assignable< Loading @@ -1394,14 +1399,14 @@ public: std::unique_ptr< MemberApproach< ExportTest, Traits<ExportTest>::ttype::type<index> DefaultTraits<ExportTest>::ttype::type<index> >>&, const std::string& ) >, Functor<ExportTest, Traits<ExportTest>::ttype::type<index>>>::value, ""); >, Functor<ExportTest, DefaultTraits<ExportTest>::ttype::type<index>>>::value, ""); Functor<ExportTest, Traits<ExportTest>::ttype::type<index>>()(index, Traits<ExportTest>::ttype::getReference<index>(), Traits<ExportTest>::ttype::getName<index>()); Functor<ExportTest, DefaultTraits<ExportTest>::ttype::type<index>>()(index, DefaultTraits<ExportTest>::ttype::getReference<index>(), DefaultTraits<ExportTest>::ttype::getName<index>()); TraitApply<index - 1>::template apply<Functor>(); } Loading @@ -1419,13 +1424,13 @@ public: std::unique_ptr< MemberApproach< ExportTest, Traits<ExportTest>::ttype::type<0> DefaultTraits<ExportTest>::ttype::type<0> >>&, const std::string& ) >, Functor>>::type { f(0, Traits<ExportTest>::ttype::getReference<0>(), Traits<ExportTest>::ttype::getName<0>()); f(0, DefaultTraits<ExportTest>::ttype::getReference<0>(), DefaultTraits<ExportTest>::ttype::getName<0>()); } Loading @@ -1436,20 +1441,20 @@ public: void(std::unique_ptr< MemberApproach< ExportTest, Traits<ExportTest>::ttype::type<0> DefaultTraits<ExportTest>::ttype::type<0> >>&, const std::string& ) >, Functor>>::type { f(Traits<ExportTest>::ttype::getReference<0>(), Traits<ExportTest>::ttype::getName<0>()); f(DefaultTraits<ExportTest>::ttype::getReference<0>(), DefaultTraits<ExportTest>::ttype::getName<0>()); } template <template <typename, typename>class Functor> static auto apply () -> typename std::enable_if<std::is_class<Functor<ExportTest,Traits<ExportTest>::ttype::type<0>>>::value>::type -> typename std::enable_if<std::is_class<Functor<ExportTest,DefaultTraits<ExportTest>::ttype::type<0>>>::value>::type { Functor<ExportTest, Traits<ExportTest>::ttype::type<0>>()(0, Traits<ExportTest>::ttype::getReference<0>(), Traits<ExportTest>::ttype::getName<0>()); Functor<ExportTest, DefaultTraits<ExportTest>::ttype::type<0>>()(0, DefaultTraits<ExportTest>::ttype::getReference<0>(), DefaultTraits<ExportTest>::ttype::getName<0>()); } }; */ Loading @@ -1475,7 +1480,7 @@ public: { DBGVAR(Singleton<Depth>::getInstance().value,index, name); Singleton<Depth>::getInstance().value++; Traits<T>::getTraits().template apply<Func>(); DefaultTraits<T>::getTraits().template apply<Func>(); Singleton<Depth>::getInstance().value--; } }; Loading @@ -1494,14 +1499,14 @@ void testTraitApply() { //TraitApply<5>::apply(lambda1); DBGMSG("Tady"); Traits<ExportTest>::getTraits().apply<Func>(); DefaultTraits<ExportTest>::getTraits().apply<Func>(); //TraitApply<5>::apply<Func>(); Traits<ExportTest>::getTraits().apply(lambda); DefaultTraits<ExportTest>::getTraits().apply(lambda); Traits<ExportTest>::getTraits().apply(lambda1); DefaultTraits<ExportTest>::getTraits().apply(lambda1); //Traits<ExportTest>::ttype::apply<Func>(); //DefaultTraits<ExportTest>::ttype::apply<Func>(); } Loading Loading @@ -2092,7 +2097,7 @@ void testTraitPerformance() { res = 0; for(int rep = 0; rep < maxRep; rep++){ for(size_t i = 0; i < vec.size(); i++) { res += Traits<ExportTest>::getTraits().getValue<1>(vec[i]); res += DefaultTraits<ExportTest>::getTraits().getValue<1>(vec[i]); } duration += (clock.now() - start).count(); deviation += (clock.now() - start).count() * (clock.now() - start).count(); Loading Loading @@ -2238,7 +2243,7 @@ private: std::string attr = "attr"; public: const std::string& getAttr(){return attr;} friend Traits<privateAttr>; friend DefaultTraits<privateAttr>; }; MAKE_NAMED_ATTRIBUTE_TRAIT(privateAttr, "str_attr", attr); Loading @@ -2247,7 +2252,7 @@ MAKE_NAMED_ATTRIBUTE_TRAIT(privateAttr, "str_attr", attr); void testPrivateTrait(){ privateAttr a; DBGVAR(a); Traits<privateAttr>::getTraits().setValue<0>(a, "new value"); DefaultTraits<privateAttr>::getTraits().setValue<0>(a, "new value"); DBGVAR(a); } Loading Loading @@ -2275,12 +2280,12 @@ struct TraitToJson { template<typename traitedClass> static typename enable_if< (Traits<traitedClass>::ttype::size() - 1 > Index) (DefaultTraits<traitedClass>::ttype::size() - 1 > Index) >::type to_json(json& j, const traitedClass& t) { // j.at(Traits<traitedClass>::ttype::template getName<Index>()) = Traits<traitedClass>::ttype::template getValue<Index>(t); j.push_back({Traits<traitedClass>::ttype::template getName<Index>(), Traits<traitedClass>::ttype::template getValue<Index>(t)}); // j.at(DefaultTraits<traitedClass>::ttype::template getName<Index>()) = DefaultTraits<traitedClass>::ttype::template getValue<Index>(t); j.push_back({DefaultTraits<traitedClass>::ttype::template getName<Index>(), DefaultTraits<traitedClass>::ttype::template getValue<Index>(t)}); TraitToJson<Index + 1>::to_json(j, t); } Loading @@ -2288,12 +2293,12 @@ struct TraitToJson { template<typename traitedClass> static typename enable_if< (Traits<traitedClass>::ttype::size() - 1 == Index) (DefaultTraits<traitedClass>::ttype::size() - 1 == Index) >::type to_json(json& j, const traitedClass& t) { j.push_back({Traits<traitedClass>::ttype::template getName<Index>(), Traits<traitedClass>::ttype::template getValue<Index>(t)}); //j.at(Traits<traitedClass>::ttype::template getName<Index>()) = Traits<traitedClass>::ttype::template getValue<Index>(t); j.push_back({DefaultTraits<traitedClass>::ttype::template getName<Index>(), DefaultTraits<traitedClass>::ttype::template getValue<Index>(t)}); //j.at(DefaultTraits<traitedClass>::ttype::template getName<Index>()) = DefaultTraits<traitedClass>::ttype::template getValue<Index>(t); } }; Loading @@ -2314,13 +2319,13 @@ struct JsonToTrait { template<typename traitedClass> static typename enable_if< (Traits<traitedClass>::ttype::size() - 1 > Index) (DefaultTraits<traitedClass>::ttype::size() - 1 > Index) >::type from_json(const json& j, traitedClass& t) { Traits<traitedClass>::ttype::template setValue<Index>( DefaultTraits<traitedClass>::ttype::template setValue<Index>( t, j.at(Traits<traitedClass>::ttype::template getName<Index>()).template get<typename Traits<traitedClass>::ttype::template type<Index>>() j.at(DefaultTraits<traitedClass>::ttype::template getName<Index>()).template get<typename DefaultTraits<traitedClass>::ttype::template type<Index>>() ); JsonToTrait<Index + 1>::from_json(j, t); } Loading @@ -2329,13 +2334,13 @@ struct JsonToTrait { template<typename traitedClass> static typename enable_if< (Traits<traitedClass>::ttype::size() - 1 == Index) (DefaultTraits<traitedClass>::ttype::size() - 1 == Index) >::type from_json(const json& j, traitedClass& t) { Traits<traitedClass>::ttype::template setValue<Index>( DefaultTraits<traitedClass>::ttype::template setValue<Index>( t, j.at(Traits<traitedClass>::ttype::template getName<Index>()).template get<typename Traits<traitedClass>::ttype::template type<Index>>() j.at(DefaultTraits<traitedClass>::ttype::template getName<Index>()).template get<typename DefaultTraits<traitedClass>::ttype::template type<Index>>() ); } Loading src/GTMesh/Debug/VariableExport.h +49 −23 Original line number Diff line number Diff line Loading @@ -59,7 +59,10 @@ struct VariableExport { template<typename T1, typename T2> static auto exportVariable(std::ostream& ost, const std::pair<T1,T2>& b) -> void static auto exportVariable(std::ostream& ost, const std::pair<T1,T2>& b) -> typename std::enable_if< !IsTraits<T2>::value >::type { ost << "{ "; exportVariable(ost, b.first); Loading Loading @@ -146,21 +149,21 @@ struct VariableExport { } template<typename T, unsigned int Index = 0, bool = Index == DefaultIOTraits<T>::size() - 1> template<typename T, typename TraitsIO, unsigned int Index = 0, bool = Index == TraitsIO::size() - 1> struct PrintClass{ static void print(std::ostream& ost, const T &traitedClass){ PrintClass<T, Index, true>::print(ost, traitedClass); static void print(std::ostream& ost, const T &traitedClass, const TraitsIO& traitsIO){ PrintClass<T, TraitsIO, Index, true>::print(ost, traitedClass, traitsIO); ost << ", "; PrintClass<T, Index + 1>::print(ost, traitedClass); PrintClass<T, TraitsIO, Index + 1>::print(ost, traitedClass, traitsIO); } }; template<typename T, unsigned int Index> struct PrintClass<T, Index, true>{ static void print(std::ostream& ost, const T &traitedClass){ ost << '"' << DefaultIOTraits<T>::getTraits().template getName<Index>() << "\" : "; VariableExport::exportVariable(ost, DefaultIOTraits<T>::getTraits().template getValue<Index>(traitedClass)); template<typename T, typename TraitsIO, unsigned int Index> struct PrintClass<T, TraitsIO, Index, true>{ static void print(std::ostream& ost, const T &traitedClass, const TraitsIO& traitsIO){ ost << '"' << traitsIO.template getName<Index>() << "\" : "; VariableExport::exportVariable(ost, traitsIO.template getValue<Index>(traitedClass)); } }; Loading @@ -172,10 +175,20 @@ struct VariableExport { >::type { ost << "{ "; PrintClass<T>::print(ost, traitedClass); PrintClass<T, typename DefaultIOTraits<T>::traitsType>::print(ost, traitedClass, DefaultIOTraits<T>::getTraits()); ost << " }"; } template<typename T, typename... Refs> static auto exportVariable(std::ostream& ost, const std::pair<T, Traits<std::decay_t<T>, Refs...>> &traitedClassWithTraits) -> typename std::enable_if< HasDefaultIOTraits<T>::value >::type { ost << "{ "; PrintClass<T, Traits<std::decay_t<T>, Refs...>>::print(ost, traitedClassWithTraits.first, traitedClassWithTraits.second); ost << " }"; } }; Loading Loading @@ -251,7 +264,10 @@ struct VariableExport<VARIABLE_EXPORT_METHOD::stdio> { template<typename T1, typename T2> static auto exportVariable(const std::pair<T1,T2>& b) -> void static auto exportVariable(const std::pair<T1,T2>& b) -> typename std::enable_if< !IsTraits<T2>::value >::type { printf("{ "); exportVariable(b.first); Loading Loading @@ -338,26 +354,25 @@ struct VariableExport<VARIABLE_EXPORT_METHOD::stdio> { } template<typename T, unsigned int Index = 0, bool = Index == DefaultIOTraits<T>::size() - 1> template<typename T, typename TraitsIO, unsigned int Index = 0, bool = Index == TraitsIO::size() - 1> struct PrintClass{ static void print(const T &traitedClass){ PrintClass<T, Index, true>::print(traitedClass); static void print(const T &traitedClass, const TraitsIO& traitsIO){ PrintClass<T, TraitsIO, Index, true>::print(traitedClass, traitsIO); printf(", "); PrintClass<T, Index + 1>::print(traitedClass); PrintClass<T, TraitsIO, Index + 1>::print(traitedClass, traitsIO); } }; template<typename T, unsigned int Index> struct PrintClass<T, Index, true>{ static void print(const T &traitedClass){ printf("\"%s\" : ", DefaultIOTraits<T>::getTraits().template getName<Index>()); VariableExport::exportVariable(DefaultIOTraits<T>::getTraits().template getValue<Index>(traitedClass)); template<typename T, typename TraitsIO, unsigned int Index> struct PrintClass<T, TraitsIO, Index, true>{ static void print(const T &traitedClass, const TraitsIO& traitsIO){ printf("\"%s\" : ", traitsIO.template getName<Index>()); VariableExport::exportVariable(traitsIO.template getValue<Index>(traitedClass)); } }; template<typename T> static auto exportVariable(const T &traitedClass) -> typename std::enable_if< Loading @@ -365,7 +380,18 @@ struct VariableExport<VARIABLE_EXPORT_METHOD::stdio> { >::type { printf("{ "); PrintClass<T>::print(traitedClass); PrintClass<T, typename DefaultIOTraits<T>::traitsType>::print(traitedClass, DefaultIOTraits<T>::getTraits()); printf(" }"); } template<typename T, typename... Refs> static auto exportVariable(const std::pair<T, Traits<std::decay_t<T>, Refs...>>& traitedClassWithTraits) -> typename std::enable_if< HasDefaultIOTraits<T>::value >::type { printf("{ "); PrintClass<T, Traits<std::decay_t<T>, Refs...>>::print(traitedClassWithTraits.first, traitedClassWithTraits.second); printf(" }"); } Loading src/GTMesh/Traits/CustomTypeTraits.h +19 −3 Original line number Diff line number Diff line Loading @@ -44,6 +44,18 @@ struct __is_tnl_indexable< T1, void_t<decltype (std::declval<const T1&>()[0]), decltype (std::declval<const T1&>().getSize())> > : public std::true_type {}; template <typename T1, typename VOID = void> struct __is_traits : public std::false_type {}; template <typename T1> struct __is_traits< T1, void_t<decltype(T1::isTraits)> > : public std::true_type {}; template <typename T1, typename VOID = void> struct __has_default_traits : public std::false_type {}; Loading @@ -51,7 +63,7 @@ struct __has_default_traits : public std::false_type {}; template <typename T1> struct __has_default_traits< T1, void_t<decltype(DefaultTraits<T1>::getTraits)> void_t<decltype(DefaultTraits<T1>::getTraits())> > : public std::true_type {}; Loading @@ -63,7 +75,7 @@ struct __has_default_io_traits : public std::false_type {}; template <typename T1> struct __has_default_io_traits< T1, void_t<decltype(DefaultIOTraits<T1>::getTraits)> void_t<decltype(DefaultIOTraits<T1>::getTraits())> > : public std::true_type {}; Loading @@ -75,7 +87,7 @@ struct __has_default_arithmetic_traits : public std::false_type {}; template <typename T1> struct __has_default_arithmetic_traits< T1, void_t<decltype(DefaultArithmeticTraits<T1>::getTraits)> void_t<decltype(DefaultArithmeticTraits<T1>::getTraits())> > : public std::true_type {}; } // Impl namespace Loading @@ -98,6 +110,10 @@ template <typename T1> struct IsTNLIndexable : public Impl::__is_tnl_indexable<T1> {}; template<typename T> struct IsTraits : public Impl::__is_traits<T> {}; template<typename T> struct HasDefaultTraits : public Impl::__has_default_traits<T> {}; Loading src/GTMesh/Traits/Traits.h +7 −1 Original line number Diff line number Diff line Loading @@ -11,6 +11,8 @@ template<typename Class, typename...RefTypes> class Traits { public: static constexpr bool isTraits = true; template<unsigned int Index> using refType = typename std::tuple_element<Index,std::tuple<RefTypes...>>::type; Loading Loading @@ -49,11 +51,15 @@ public: /** * The constructor of Traits initializes the names * and references in the refs container. * The first parameter is specified in order to distinguish the * copy and move constructors. * @param refsAndNames a parameter pack of names and references */ template<typename...Refs> Traits(Refs... refsAndNames) : refs(refsAndNames...){} Traits(const char* n1, Refs... refsAndNames) : refs(n1, refsAndNames...){} Traits(const Traits<Class, RefTypes...>&) = default; Traits(Traits<Class, RefTypes...>&&) = default; static constexpr unsigned int size(){ return sizeof... (RefTypes); Loading src/GTMesh/Traits/TraitsAlgorithm/TraitsAlgorithm.h +14 −27 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
TemplateTest/main.cpp +59 −54 Original line number Diff line number Diff line Loading @@ -291,12 +291,12 @@ struct tempData { /* template<> class Traits<tempData>{ class DefaultTraits<tempData>{ public: using ttype = Traits<tempData, double, Vector<3,double>>; const static ttype tr; }; const Traits<tempData>::ttype Traits<tempData>::tr("density", &tempData::density, "momentum"s, std::make_pair(&tempData::getMomentum, &tempData::setMomentum)); const DefaultTraits<tempData>::ttype DefaultTraits<tempData>::tr("density", &tempData::density, "momentum"s, std::make_pair(&tempData::getMomentum, &tempData::setMomentum)); */ Loading @@ -306,7 +306,7 @@ const Traits<tempData>::ttype Traits<tempData>::tr("density", &tempData::density MAKE_CUSTOM_TRAIT(tempData, "density", &tempData::density, "momentum", std::make_pair(&tempData::getMomentum, &tempData::setMomentum)); /* template<> class Traits<tempData>{ class DefaultTraits<tempData>{ public: using traitsType = ::Traits<Class, double tempData::*, decltype(std::make_pair(&tempData::getMomentum, &tempData::setMomentum))>; static const traitsType getTraits() {return traitsType( "density", &tempData::density, "momentum", std::make_pair(&tempData::getMomentum, &tempData::setMomentum));} Loading Loading @@ -360,12 +360,12 @@ struct testData { /* template<> class Traits<tempData>{ class DefaultTraits<tempData>{ public: using ttype = Traits<tempData, double, Vector<3,double>>; const static ttype tr; }; const Traits<tempData>::ttype Traits<tempData>::tr("density", &tempData::density, "momentum"s, std::make_pair(&tempData::getMomentum, &tempData::setMomentum)); const DefaultTraits<tempData>::ttype DefaultTraits<tempData>::tr("density", &tempData::density, "momentum"s, std::make_pair(&tempData::getMomentum, &tempData::setMomentum)); */ Loading @@ -380,14 +380,14 @@ void testMemberRef(){ tempData d; //DBGVAR(Traits<tempData>::ttype::getName<0>()); //DBGVAR(DefaultTraits<tempData>::ttype::getName<0>()); Traits<tempData>::getTraits().getReference<0>().setValue(&d, 0.0); DBGVAR(Traits<tempData>::getTraits().getReference<0>().getValue(&d)); Traits<tempData>::getTraits().getReference<0>().setValue(d, 42.15); Traits<tempData>::getTraits().getReference<1>().setValue(&d, {42.15,84.30,42.15}); DefaultTraits<tempData>::getTraits().getReference<0>().setValue(&d, 0.0); DBGVAR(DefaultTraits<tempData>::getTraits().getReference<0>().getValue(&d)); DefaultTraits<tempData>::getTraits().getReference<0>().setValue(d, 42.15); DefaultTraits<tempData>::getTraits().getReference<1>().setValue(&d, {42.15,84.30,42.15}); DBGVAR(Traits<tempData>::getTraits().getName<0>(),(Traits<tempData>::getTraits().getReference<0>().getValue(&d)), Traits<tempData>::getTraits().getName<1>(), d.velocity); DBGVAR(DefaultTraits<tempData>::getTraits().getName<0>(),(DefaultTraits<tempData>::getTraits().getReference<0>().getValue(&d)), DefaultTraits<tempData>::getTraits().getName<1>(), d.velocity); DBGVAR(HasDefaultTraits<tempData>::value, d); Traits<tempData, decltype(&tempData::getData)> trait("density", &tempData::getData); Loading Loading @@ -437,7 +437,7 @@ public: explicit TraitedClass() {DBGMSG("TC construtor");} //TraitedClass(const TraitedClass& rhs) = default; //TraitedClass(TraitedClass&&) = default; friend class Traits<TraitedClass>; friend class DefaultTraits<TraitedClass>; template<unsigned int... Idxs> auto& operator[](integer_sequence<unsigned int, Idxs...>){ Loading @@ -452,6 +452,7 @@ MAKE_ATTRIBUTE_TRAIT(ns::TraitedClass, d1, d2, ts); template <typename T> auto sum(const T& val){ DBGVAR(val); return TraitsAggregationProcesor<BinaryPlus>::evaluate(val); } Loading @@ -459,6 +460,10 @@ void testTraitsAlgorithms() { ExportTest e1, e2; ExportTest res = e1 + e2; std::vector<ExportTest> vec(40, ExportTest()); DBGVAR(std::make_pair(e1, DefaultArithmeticTraits<ExportTest>::getTraits())); DBGVAR(std::make_pair(e1.attrTempData, DefaultArithmeticTraits<tempData>::getTraits())); DBGVAR(sum(e1)); DBGVAR(2.45*e1,e1 + e2, e1, e2,HasDefaultArithmeticTraits<int>::value, max(e2), min(e2), max(vec)); Loading Loading @@ -1151,7 +1156,7 @@ void testNumericTraitsPerformance() { DBGMSG("Traits approach instead of numeric traits +="); Traits<NumStruct2> t; DefaultTraits<NumStruct2> t; start = clock.now(); res2 = NumStruct2({0,0}); for(int rep = 0; rep < maxRep; rep++){ Loading Loading @@ -1266,7 +1271,7 @@ Test of trasposing vector of struct to struct of vectors */ template <typename DataType, typename DataTypeTrait = Traits<DataType>> template <typename DataType, typename DataTypeTrait = DefaultTraits<DataType>> struct Container{ template <unsigned int index = 0, typename Dummy = void> struct StructOfArrays : public StructOfArrays<index + 1>{ Loading @@ -1275,7 +1280,7 @@ struct Container{ template <typename Dummy> struct StructOfArrays<Traits<DataType>::traitsType::size() - 1, Dummy>{ struct StructOfArrays<DefaultTraits<DataType>::traitsType::size() - 1, Dummy>{ std::vector<typename DataTypeTrait::template type<DataTypeTrait::size() - 1>> vec; }; Loading @@ -1287,18 +1292,18 @@ struct Container{ template <unsigned int pos> const char* name() { return Traits<DataType>::getTraits().template getName<pos>(); return DefaultTraits<DataType>::getTraits().template getName<pos>(); } template <unsigned int pos> std::vector<typename Traits<DataType>::traitsType::template type<pos>>& getDataAtPos() { std::vector<typename DefaultTraits<DataType>::traitsType::template type<pos>>& getDataAtPos() { return data.StructOfArrays<pos>::vec; } }; void testStructTransposition() { Container<ExportTest, Traits<ExportTest>::traitsType> data; Container<ExportTest, DefaultTraits<ExportTest>::traitsType> data; data.getDataAtPos<5>().resize(2); DBGVAR(data.size(), data.getDataAtPos<5>(), data.name<5>()); Loading Loading @@ -1329,7 +1334,7 @@ public: std::unique_ptr< MemberApproach< ExportTest, Traits<ExportTest>::ttype::type<index> DefaultTraits<ExportTest>::ttype::type<index> >>&, const std::string& ) Loading @@ -1342,13 +1347,13 @@ public: std::unique_ptr< MemberApproach< ExportTest, Traits<ExportTest>::ttype::type<index> DefaultTraits<ExportTest>::ttype::type<index> >>&, const std::string& ) >, Functor>, ""); f(index, Traits<ExportTest>::ttype::getReference<index>(), Traits<ExportTest>::ttype::getName<index>()); f(index, DefaultTraits<ExportTest>::ttype::getReference<index>(), DefaultTraits<ExportTest>::ttype::getName<index>()); TraitApply<index - 1>::apply(f); } Loading @@ -1361,7 +1366,7 @@ public: void(std::unique_ptr< MemberApproach< ExportTest, Traits<ExportTest>::ttype::type<index> DefaultTraits<ExportTest>::ttype::type<index> >>&, const std::string& ) Loading @@ -1373,19 +1378,19 @@ public: void(std::unique_ptr< MemberApproach< ExportTest, Traits<ExportTest>::ttype::type<index> DefaultTraits<ExportTest>::ttype::type<index> >>&, const std::string& ) >, Functor>, ""); f(Traits<ExportTest>::ttype::getReference<index>(), Traits<ExportTest>::ttype::getName<index>()); f(DefaultTraits<ExportTest>::ttype::getReference<index>(), DefaultTraits<ExportTest>::ttype::getName<index>()); TraitApply<index - 1>::apply(f); } template <template <typename, typename>class Functor> static auto apply () -> typename std::enable_if<std::is_class<Functor<ExportTest, Traits<ExportTest>::ttype::type<index>>>::value>::type -> typename std::enable_if<std::is_class<Functor<ExportTest, DefaultTraits<ExportTest>::ttype::type<index>>>::value>::type { static_assert (std::is_assignable< Loading @@ -1394,14 +1399,14 @@ public: std::unique_ptr< MemberApproach< ExportTest, Traits<ExportTest>::ttype::type<index> DefaultTraits<ExportTest>::ttype::type<index> >>&, const std::string& ) >, Functor<ExportTest, Traits<ExportTest>::ttype::type<index>>>::value, ""); >, Functor<ExportTest, DefaultTraits<ExportTest>::ttype::type<index>>>::value, ""); Functor<ExportTest, Traits<ExportTest>::ttype::type<index>>()(index, Traits<ExportTest>::ttype::getReference<index>(), Traits<ExportTest>::ttype::getName<index>()); Functor<ExportTest, DefaultTraits<ExportTest>::ttype::type<index>>()(index, DefaultTraits<ExportTest>::ttype::getReference<index>(), DefaultTraits<ExportTest>::ttype::getName<index>()); TraitApply<index - 1>::template apply<Functor>(); } Loading @@ -1419,13 +1424,13 @@ public: std::unique_ptr< MemberApproach< ExportTest, Traits<ExportTest>::ttype::type<0> DefaultTraits<ExportTest>::ttype::type<0> >>&, const std::string& ) >, Functor>>::type { f(0, Traits<ExportTest>::ttype::getReference<0>(), Traits<ExportTest>::ttype::getName<0>()); f(0, DefaultTraits<ExportTest>::ttype::getReference<0>(), DefaultTraits<ExportTest>::ttype::getName<0>()); } Loading @@ -1436,20 +1441,20 @@ public: void(std::unique_ptr< MemberApproach< ExportTest, Traits<ExportTest>::ttype::type<0> DefaultTraits<ExportTest>::ttype::type<0> >>&, const std::string& ) >, Functor>>::type { f(Traits<ExportTest>::ttype::getReference<0>(), Traits<ExportTest>::ttype::getName<0>()); f(DefaultTraits<ExportTest>::ttype::getReference<0>(), DefaultTraits<ExportTest>::ttype::getName<0>()); } template <template <typename, typename>class Functor> static auto apply () -> typename std::enable_if<std::is_class<Functor<ExportTest,Traits<ExportTest>::ttype::type<0>>>::value>::type -> typename std::enable_if<std::is_class<Functor<ExportTest,DefaultTraits<ExportTest>::ttype::type<0>>>::value>::type { Functor<ExportTest, Traits<ExportTest>::ttype::type<0>>()(0, Traits<ExportTest>::ttype::getReference<0>(), Traits<ExportTest>::ttype::getName<0>()); Functor<ExportTest, DefaultTraits<ExportTest>::ttype::type<0>>()(0, DefaultTraits<ExportTest>::ttype::getReference<0>(), DefaultTraits<ExportTest>::ttype::getName<0>()); } }; */ Loading @@ -1475,7 +1480,7 @@ public: { DBGVAR(Singleton<Depth>::getInstance().value,index, name); Singleton<Depth>::getInstance().value++; Traits<T>::getTraits().template apply<Func>(); DefaultTraits<T>::getTraits().template apply<Func>(); Singleton<Depth>::getInstance().value--; } }; Loading @@ -1494,14 +1499,14 @@ void testTraitApply() { //TraitApply<5>::apply(lambda1); DBGMSG("Tady"); Traits<ExportTest>::getTraits().apply<Func>(); DefaultTraits<ExportTest>::getTraits().apply<Func>(); //TraitApply<5>::apply<Func>(); Traits<ExportTest>::getTraits().apply(lambda); DefaultTraits<ExportTest>::getTraits().apply(lambda); Traits<ExportTest>::getTraits().apply(lambda1); DefaultTraits<ExportTest>::getTraits().apply(lambda1); //Traits<ExportTest>::ttype::apply<Func>(); //DefaultTraits<ExportTest>::ttype::apply<Func>(); } Loading Loading @@ -2092,7 +2097,7 @@ void testTraitPerformance() { res = 0; for(int rep = 0; rep < maxRep; rep++){ for(size_t i = 0; i < vec.size(); i++) { res += Traits<ExportTest>::getTraits().getValue<1>(vec[i]); res += DefaultTraits<ExportTest>::getTraits().getValue<1>(vec[i]); } duration += (clock.now() - start).count(); deviation += (clock.now() - start).count() * (clock.now() - start).count(); Loading Loading @@ -2238,7 +2243,7 @@ private: std::string attr = "attr"; public: const std::string& getAttr(){return attr;} friend Traits<privateAttr>; friend DefaultTraits<privateAttr>; }; MAKE_NAMED_ATTRIBUTE_TRAIT(privateAttr, "str_attr", attr); Loading @@ -2247,7 +2252,7 @@ MAKE_NAMED_ATTRIBUTE_TRAIT(privateAttr, "str_attr", attr); void testPrivateTrait(){ privateAttr a; DBGVAR(a); Traits<privateAttr>::getTraits().setValue<0>(a, "new value"); DefaultTraits<privateAttr>::getTraits().setValue<0>(a, "new value"); DBGVAR(a); } Loading Loading @@ -2275,12 +2280,12 @@ struct TraitToJson { template<typename traitedClass> static typename enable_if< (Traits<traitedClass>::ttype::size() - 1 > Index) (DefaultTraits<traitedClass>::ttype::size() - 1 > Index) >::type to_json(json& j, const traitedClass& t) { // j.at(Traits<traitedClass>::ttype::template getName<Index>()) = Traits<traitedClass>::ttype::template getValue<Index>(t); j.push_back({Traits<traitedClass>::ttype::template getName<Index>(), Traits<traitedClass>::ttype::template getValue<Index>(t)}); // j.at(DefaultTraits<traitedClass>::ttype::template getName<Index>()) = DefaultTraits<traitedClass>::ttype::template getValue<Index>(t); j.push_back({DefaultTraits<traitedClass>::ttype::template getName<Index>(), DefaultTraits<traitedClass>::ttype::template getValue<Index>(t)}); TraitToJson<Index + 1>::to_json(j, t); } Loading @@ -2288,12 +2293,12 @@ struct TraitToJson { template<typename traitedClass> static typename enable_if< (Traits<traitedClass>::ttype::size() - 1 == Index) (DefaultTraits<traitedClass>::ttype::size() - 1 == Index) >::type to_json(json& j, const traitedClass& t) { j.push_back({Traits<traitedClass>::ttype::template getName<Index>(), Traits<traitedClass>::ttype::template getValue<Index>(t)}); //j.at(Traits<traitedClass>::ttype::template getName<Index>()) = Traits<traitedClass>::ttype::template getValue<Index>(t); j.push_back({DefaultTraits<traitedClass>::ttype::template getName<Index>(), DefaultTraits<traitedClass>::ttype::template getValue<Index>(t)}); //j.at(DefaultTraits<traitedClass>::ttype::template getName<Index>()) = DefaultTraits<traitedClass>::ttype::template getValue<Index>(t); } }; Loading @@ -2314,13 +2319,13 @@ struct JsonToTrait { template<typename traitedClass> static typename enable_if< (Traits<traitedClass>::ttype::size() - 1 > Index) (DefaultTraits<traitedClass>::ttype::size() - 1 > Index) >::type from_json(const json& j, traitedClass& t) { Traits<traitedClass>::ttype::template setValue<Index>( DefaultTraits<traitedClass>::ttype::template setValue<Index>( t, j.at(Traits<traitedClass>::ttype::template getName<Index>()).template get<typename Traits<traitedClass>::ttype::template type<Index>>() j.at(DefaultTraits<traitedClass>::ttype::template getName<Index>()).template get<typename DefaultTraits<traitedClass>::ttype::template type<Index>>() ); JsonToTrait<Index + 1>::from_json(j, t); } Loading @@ -2329,13 +2334,13 @@ struct JsonToTrait { template<typename traitedClass> static typename enable_if< (Traits<traitedClass>::ttype::size() - 1 == Index) (DefaultTraits<traitedClass>::ttype::size() - 1 == Index) >::type from_json(const json& j, traitedClass& t) { Traits<traitedClass>::ttype::template setValue<Index>( DefaultTraits<traitedClass>::ttype::template setValue<Index>( t, j.at(Traits<traitedClass>::ttype::template getName<Index>()).template get<typename Traits<traitedClass>::ttype::template type<Index>>() j.at(DefaultTraits<traitedClass>::ttype::template getName<Index>()).template get<typename DefaultTraits<traitedClass>::ttype::template type<Index>>() ); } Loading
src/GTMesh/Debug/VariableExport.h +49 −23 Original line number Diff line number Diff line Loading @@ -59,7 +59,10 @@ struct VariableExport { template<typename T1, typename T2> static auto exportVariable(std::ostream& ost, const std::pair<T1,T2>& b) -> void static auto exportVariable(std::ostream& ost, const std::pair<T1,T2>& b) -> typename std::enable_if< !IsTraits<T2>::value >::type { ost << "{ "; exportVariable(ost, b.first); Loading Loading @@ -146,21 +149,21 @@ struct VariableExport { } template<typename T, unsigned int Index = 0, bool = Index == DefaultIOTraits<T>::size() - 1> template<typename T, typename TraitsIO, unsigned int Index = 0, bool = Index == TraitsIO::size() - 1> struct PrintClass{ static void print(std::ostream& ost, const T &traitedClass){ PrintClass<T, Index, true>::print(ost, traitedClass); static void print(std::ostream& ost, const T &traitedClass, const TraitsIO& traitsIO){ PrintClass<T, TraitsIO, Index, true>::print(ost, traitedClass, traitsIO); ost << ", "; PrintClass<T, Index + 1>::print(ost, traitedClass); PrintClass<T, TraitsIO, Index + 1>::print(ost, traitedClass, traitsIO); } }; template<typename T, unsigned int Index> struct PrintClass<T, Index, true>{ static void print(std::ostream& ost, const T &traitedClass){ ost << '"' << DefaultIOTraits<T>::getTraits().template getName<Index>() << "\" : "; VariableExport::exportVariable(ost, DefaultIOTraits<T>::getTraits().template getValue<Index>(traitedClass)); template<typename T, typename TraitsIO, unsigned int Index> struct PrintClass<T, TraitsIO, Index, true>{ static void print(std::ostream& ost, const T &traitedClass, const TraitsIO& traitsIO){ ost << '"' << traitsIO.template getName<Index>() << "\" : "; VariableExport::exportVariable(ost, traitsIO.template getValue<Index>(traitedClass)); } }; Loading @@ -172,10 +175,20 @@ struct VariableExport { >::type { ost << "{ "; PrintClass<T>::print(ost, traitedClass); PrintClass<T, typename DefaultIOTraits<T>::traitsType>::print(ost, traitedClass, DefaultIOTraits<T>::getTraits()); ost << " }"; } template<typename T, typename... Refs> static auto exportVariable(std::ostream& ost, const std::pair<T, Traits<std::decay_t<T>, Refs...>> &traitedClassWithTraits) -> typename std::enable_if< HasDefaultIOTraits<T>::value >::type { ost << "{ "; PrintClass<T, Traits<std::decay_t<T>, Refs...>>::print(ost, traitedClassWithTraits.first, traitedClassWithTraits.second); ost << " }"; } }; Loading Loading @@ -251,7 +264,10 @@ struct VariableExport<VARIABLE_EXPORT_METHOD::stdio> { template<typename T1, typename T2> static auto exportVariable(const std::pair<T1,T2>& b) -> void static auto exportVariable(const std::pair<T1,T2>& b) -> typename std::enable_if< !IsTraits<T2>::value >::type { printf("{ "); exportVariable(b.first); Loading Loading @@ -338,26 +354,25 @@ struct VariableExport<VARIABLE_EXPORT_METHOD::stdio> { } template<typename T, unsigned int Index = 0, bool = Index == DefaultIOTraits<T>::size() - 1> template<typename T, typename TraitsIO, unsigned int Index = 0, bool = Index == TraitsIO::size() - 1> struct PrintClass{ static void print(const T &traitedClass){ PrintClass<T, Index, true>::print(traitedClass); static void print(const T &traitedClass, const TraitsIO& traitsIO){ PrintClass<T, TraitsIO, Index, true>::print(traitedClass, traitsIO); printf(", "); PrintClass<T, Index + 1>::print(traitedClass); PrintClass<T, TraitsIO, Index + 1>::print(traitedClass, traitsIO); } }; template<typename T, unsigned int Index> struct PrintClass<T, Index, true>{ static void print(const T &traitedClass){ printf("\"%s\" : ", DefaultIOTraits<T>::getTraits().template getName<Index>()); VariableExport::exportVariable(DefaultIOTraits<T>::getTraits().template getValue<Index>(traitedClass)); template<typename T, typename TraitsIO, unsigned int Index> struct PrintClass<T, TraitsIO, Index, true>{ static void print(const T &traitedClass, const TraitsIO& traitsIO){ printf("\"%s\" : ", traitsIO.template getName<Index>()); VariableExport::exportVariable(traitsIO.template getValue<Index>(traitedClass)); } }; template<typename T> static auto exportVariable(const T &traitedClass) -> typename std::enable_if< Loading @@ -365,7 +380,18 @@ struct VariableExport<VARIABLE_EXPORT_METHOD::stdio> { >::type { printf("{ "); PrintClass<T>::print(traitedClass); PrintClass<T, typename DefaultIOTraits<T>::traitsType>::print(traitedClass, DefaultIOTraits<T>::getTraits()); printf(" }"); } template<typename T, typename... Refs> static auto exportVariable(const std::pair<T, Traits<std::decay_t<T>, Refs...>>& traitedClassWithTraits) -> typename std::enable_if< HasDefaultIOTraits<T>::value >::type { printf("{ "); PrintClass<T, Traits<std::decay_t<T>, Refs...>>::print(traitedClassWithTraits.first, traitedClassWithTraits.second); printf(" }"); } Loading
src/GTMesh/Traits/CustomTypeTraits.h +19 −3 Original line number Diff line number Diff line Loading @@ -44,6 +44,18 @@ struct __is_tnl_indexable< T1, void_t<decltype (std::declval<const T1&>()[0]), decltype (std::declval<const T1&>().getSize())> > : public std::true_type {}; template <typename T1, typename VOID = void> struct __is_traits : public std::false_type {}; template <typename T1> struct __is_traits< T1, void_t<decltype(T1::isTraits)> > : public std::true_type {}; template <typename T1, typename VOID = void> struct __has_default_traits : public std::false_type {}; Loading @@ -51,7 +63,7 @@ struct __has_default_traits : public std::false_type {}; template <typename T1> struct __has_default_traits< T1, void_t<decltype(DefaultTraits<T1>::getTraits)> void_t<decltype(DefaultTraits<T1>::getTraits())> > : public std::true_type {}; Loading @@ -63,7 +75,7 @@ struct __has_default_io_traits : public std::false_type {}; template <typename T1> struct __has_default_io_traits< T1, void_t<decltype(DefaultIOTraits<T1>::getTraits)> void_t<decltype(DefaultIOTraits<T1>::getTraits())> > : public std::true_type {}; Loading @@ -75,7 +87,7 @@ struct __has_default_arithmetic_traits : public std::false_type {}; template <typename T1> struct __has_default_arithmetic_traits< T1, void_t<decltype(DefaultArithmeticTraits<T1>::getTraits)> void_t<decltype(DefaultArithmeticTraits<T1>::getTraits())> > : public std::true_type {}; } // Impl namespace Loading @@ -98,6 +110,10 @@ template <typename T1> struct IsTNLIndexable : public Impl::__is_tnl_indexable<T1> {}; template<typename T> struct IsTraits : public Impl::__is_traits<T> {}; template<typename T> struct HasDefaultTraits : public Impl::__has_default_traits<T> {}; Loading
src/GTMesh/Traits/Traits.h +7 −1 Original line number Diff line number Diff line Loading @@ -11,6 +11,8 @@ template<typename Class, typename...RefTypes> class Traits { public: static constexpr bool isTraits = true; template<unsigned int Index> using refType = typename std::tuple_element<Index,std::tuple<RefTypes...>>::type; Loading Loading @@ -49,11 +51,15 @@ public: /** * The constructor of Traits initializes the names * and references in the refs container. * The first parameter is specified in order to distinguish the * copy and move constructors. * @param refsAndNames a parameter pack of names and references */ template<typename...Refs> Traits(Refs... refsAndNames) : refs(refsAndNames...){} Traits(const char* n1, Refs... refsAndNames) : refs(n1, refsAndNames...){} Traits(const Traits<Class, RefTypes...>&) = default; Traits(Traits<Class, RefTypes...>&&) = default; static constexpr unsigned int size(){ return sizeof... (RefTypes); Loading
src/GTMesh/Traits/TraitsAlgorithm/TraitsAlgorithm.h +14 −27 File changed.Preview size limit exceeded, changes collapsed. Show changes