From fc99e5b94c5ed1570d28f366a558ad4ca8281f08 Mon Sep 17 00:00:00 2001 From: Maarten Hilferink Date: Tue, 19 Sep 2023 20:09:24 +0200 Subject: [PATCH] #314: user considerations added; template operator simplifications --- clc/dll/include/AttrBinStruct.h | 129 ++++++++++++++++++++++++-------- clc/dll/include/OperAccUni.h | 15 +--- clc/dll/include/OperAccUniNum.h | 4 +- clc/dll/src/BoostBlas.cpp | 6 +- clc/dll/src/ClassBreak.cpp | 2 +- clc/dll/src/Classify.cpp | 2 +- clc/dll/src/Cumulate.cpp | 8 +- clc/dll/src/ID.cpp | 2 +- clc/dll/src/Index.cpp | 4 +- clc/dll/src/Invert.cpp | 2 +- clc/dll/src/OperAttrBin.cpp | 11 ++- clc/dll/src/OperAttrTer.cpp | 4 +- clc/dll/src/OperAttrUni.cpp | 2 +- clc/dll/src/OperUnit.cpp | 10 +-- clc/dll/src/PCount.cpp | 10 +-- clc/dll/src/RLookup.cpp | 2 +- clc/dll/src/Ramp.cpp | 2 +- clc/dll/src/Sort.cpp | 2 +- clc/dll/src/Subset.cpp | 6 +- clc/dll/src/Union.cpp | 2 +- clc/dll/src/Unique.cpp | 2 +- clc/dll/src/lookup.cpp | 21 +++--- clc/dll/src/random.cpp | 2 +- geo/dll/src/BoostGeometry.cpp | 22 +++--- geo/dll/src/BoostPolygon.cpp | 6 +- geo/dll/src/Canyon.cpp | 2 +- geo/dll/src/Connect.cpp | 2 +- geo/dll/src/Dijkstra.cpp | 2 +- geo/dll/src/GridDist.cpp | 2 +- geo/dll/src/OperPolygon.cpp | 6 +- geo/dll/src/Perimeter.cpp | 2 +- geo/dll/src/Point.cpp | 2 +- geo/dll/src/RegCount.cpp | 2 +- geo/dll/src/Voronoi.cpp | 2 +- geo/dll/src/nth_element.cpp | 2 +- rtc/dll/src/geo/ElemTraits.h | 7 ++ rtc/dll/src/geo/Point.h | 13 ++++ rtc/dll/src/utl/TypeListOper.h | 53 +++++++++---- shv/dll/src/Poly2GridOper.cpp | 4 +- tic/dll/src/Unit.cpp | 6 +- 40 files changed, 245 insertions(+), 140 deletions(-) diff --git a/clc/dll/include/AttrBinStruct.h b/clc/dll/include/AttrBinStruct.h index fbaacdce6..09ef64c76 100644 --- a/clc/dll/include/AttrBinStruct.h +++ b/clc/dll/include/AttrBinStruct.h @@ -9,6 +9,7 @@ #include +#include "mci/ValueClass.h" #include "utl/StringFunc.h" #include "Prototypes.h" @@ -140,30 +141,90 @@ void do_binary_func( // ***************************************************************************** template -[[noreturn]] void throwOverflow(CharPtr opName, T a, CharPtr preposition, T b) +[[noreturn]] void throwOverflow(CharPtr opName, T a, CharPtr preposition, T b, CharPtr alternativeFunc, const ValueClass* alternativeValueClass) { SharedStr vcName = AsString(ValueWrap::GetStaticClass()->GetID()); - throwDmsErrF("Numeric overflow when %1% %2% values %3% %4% %5%" + SharedStr acName; + if (alternativeValueClass) + acName = AsString(alternativeValueClass->GetID()); + + throwDmsErrF("Numeric overflow when %1% %2% values %3% %4% %5%;\n" + "Consider using %6% if your model deals with overflow as null values%7%%8%." , opName, vcName.c_str(), AsString(a), preposition, AsString(b) + , alternativeFunc + , alternativeValueClass ? " or consider converting the arguments to " : "" + , alternativeValueClass ? acName.c_str() : "" ); } -template +template +const ValueClass* NextAddIntegral() +{ + constexpr auto nrBits = nrbits_of_v; + constexpr bool isSigned = is_signed_v; + switch (nrBits) + { + case 1: return ValueWrap::GetStaticClass(); + case 2: return ValueWrap::GetStaticClass(); + case 4: return ValueWrap::GetStaticClass(); + case 8: return isSigned + ? ValueWrap::GetStaticClass() + : ValueWrap::GetStaticClass(); + case 16: return isSigned + ? ValueWrap::GetStaticClass() + : ValueWrap::GetStaticClass(); + case 32: return isSigned + ? ValueWrap::GetStaticClass() + : ValueWrap::GetStaticClass(); + case 64: return nullptr; + default: + std::unreachable(); + } +} + +template +const ValueClass* NextSubIntegral() +{ + constexpr auto nrBits = nrbits_of_v; + constexpr bool isSigned = is_signed_v; + switch (nrBits) + { + case 1: return ValueWrap::GetStaticClass(); + case 2: return ValueWrap::GetStaticClass(); + case 4: return ValueWrap::GetStaticClass(); + case 8: return isSigned + ? ValueWrap::GetStaticClass() + : ValueWrap::GetStaticClass(); + case 16: return isSigned + ? ValueWrap::GetStaticClass() + : ValueWrap::GetStaticClass(); + case 32: return isSigned + ? ValueWrap::GetStaticClass() + : ValueWrap::GetStaticClass(); + case 64: return isSigned + ? nullptr + : ValueWrap::GetStaticClass(); + default: + std::unreachable(); + } +} + +template struct safe_plus { - T operator ()(T a, T b) const + V operator ()(V a, V b) const { - T result = a + b; - if constexpr (!std::is_floating_point_v) + V result = a + b; + if constexpr (!std::is_floating_point_v) { if (!IsDefined(a)) - return UNDEFINED_VALUE(T); + return UNDEFINED_VALUE(V); if (!IsDefined(b)) - return UNDEFINED_VALUE(T); - if constexpr (!is_signed_v) + return UNDEFINED_VALUE(V); + if constexpr (!is_signed_v) { if (result < a) - throwOverflow("adding", a, "and", b); + throwOverflow("adding", a, "and", b, "add_or_null", NextAddIntegral()); } else { @@ -174,7 +235,7 @@ struct safe_plus { auto resultNonnegative = (result >= 0); if (aNonnegative !=resultNonnegative) - throwOverflow("adding", a, "and", b); + throwOverflow("adding", a, "and", b, "add_or_null", NextAddIntegral()); } } } @@ -182,14 +243,14 @@ struct safe_plus } }; -template -struct safe_plus < Point > +template +struct safe_plus < Point > { - Point operator ()(Point a, Point b) const + Point operator ()(Point a, Point b) const { - return Point( scalar_op(a.first, b.first), scalar_op(a.second, b.second) ); + return Point( scalar_op(a.first, b.first), scalar_op(a.second, b.second) ); } - safe_plus scalar_op; + safe_plus scalar_op; }; template @@ -207,7 +268,7 @@ struct safe_minus if constexpr (!is_signed_v) { if (a < b) - throwOverflow("subtracting", b, "from", a); + throwOverflow("subtracting", b, "from", a, "sub_or_null", NextSubIntegral()); } else { @@ -218,7 +279,7 @@ struct safe_minus { auto resultNonnegative = (result >= 0); if (aNonnegative != resultNonnegative) - throwOverflow("subtracting", b, "from", a); + throwOverflow("subtracting", b, "from", a, "sub_or_null", NextSubIntegral()); } } } @@ -325,51 +386,52 @@ struct safe_minus_or_null < Point > }; -template struct plus_func : std_binary_func< safe_plus, T, T, T> +template struct plus_func : std_binary_func< safe_plus, T, T, T> { static ConstUnitRef unit_creator(const AbstrOperGroup* gr, const ArgSeqType& args) { return compatible_values_unit_creator_func(0, gr, args, false); } }; -template struct minus_func: std_binary_func< safe_minus, T, T, T> +template struct minus_func: std_binary_func< safe_minus, T, T, T> { static ConstUnitRef unit_creator(const AbstrOperGroup* gr, const ArgSeqType& args) { return compatible_values_unit_creator_func(0, gr, args, false); } }; -template struct plus_or_null_func : std_binary_func< safe_plus_or_null, T, T, T> +template struct plus_or_null_func : std_binary_func< safe_plus_or_null, T, T, T> { static ConstUnitRef unit_creator(const AbstrOperGroup* gr, const ArgSeqType& args) { return compatible_values_unit_creator_func(0, gr, args, false); } }; -template struct minus_or_null_func : std_binary_func< safe_minus_or_null, T, T, T> +template struct minus_or_null_func : std_binary_func< safe_minus_or_null, T, T, T> { static ConstUnitRef unit_creator(const AbstrOperGroup* gr, const ArgSeqType& args) { return compatible_values_unit_creator_func(0, gr, args, false); } }; -template struct mul_func : binary_func +template +struct mul_func_impl : binary_func { static ConstUnitRef unit_creator(const AbstrOperGroup* gr, const ArgSeqType& args) { return mul2_unit_creator(gr, args); } - T operator()(cref_t a, cref_t b) const + V operator()(cref_t a, cref_t b) const { - if constexpr (!std::is_floating_point_v && has_undefines_v) + if constexpr (!std::is_floating_point_v && has_undefines_v) { if (!IsDefined(a) || !IsDefined(b)) - return UNDEFINED_VALUE(T); + return UNDEFINED_VALUE(V); } - T result = a * b; + V result = a * b; - if constexpr (!std::is_floating_point_v) + if constexpr (!std::is_floating_point_v) { if (a && b && b != result / a) - throwOverflow("multiplying", a, "and", b); + throwOverflow("multiplying", a, "and", b, "mul_or_null", NextAddIntegral()); } return result; } }; -template struct mul_func< Point> : binary_func, Point, Point> +template struct mul_func_impl> : binary_func, Point, Point> { static ConstUnitRef unit_creator(const AbstrOperGroup* gr, const ArgSeqType& args) { return mul2_unit_creator(gr, args); } @@ -377,9 +439,12 @@ template struct mul_func< Point> : binary_func, Point(scalar_op(a.first, b.first), scalar_op(a.second, b.second)); } - mul_func scalar_op; + mul_func_impl scalar_op; }; + +template struct mul_func : mul_func_impl {}; + template struct mul_or_null_func : binary_func { static ConstUnitRef unit_creator(const AbstrOperGroup* gr, const ArgSeqType& args) { return mul2_unit_creator(gr, args); } @@ -415,7 +480,7 @@ template struct mul_or_null_func< Point> : binary_func, mul_or_null_func scalar_op; }; -template +template struct mulx_func : binary_func::type, T, T> { typename mulx_func::res_type operator()(typename mulx_func::arg1_cref a1, typename mulx_func::arg2_cref a2) const diff --git a/clc/dll/include/OperAccUni.h b/clc/dll/include/OperAccUni.h index 53a0e0d70..db4214066 100644 --- a/clc/dll/include/OperAccUni.h +++ b/clc/dll/include/OperAccUni.h @@ -352,20 +352,11 @@ struct OperAccPartUniDirect : FuncOperAccPartUni struct make_direct { typedef OperAccPartUniDirect type; }; -template struct make_buffered { typedef OperAccPartUniBuffered type; }; +template struct make_direct { using type = OperAccPartUniDirect ; }; +template struct make_buffered { using type = OperAccPartUniBuffered; }; template using base_of = std::conditional_t< impl::has_dms_result_type::value, make_buffered, make_direct >; - -template -struct OperAccPartUniBest: base_of -{ - OperAccPartUniBest(AbstrOperGroup* gr, const TAcc1Func& acc1Func = TAcc1Func()) - : base_of(gr, acc1Func) - {} -}; - - +template using OperAccPartUniBest = typename base_of::type; template void CalcOperAccPartUniSer(DataWriteLock& res, const AbstrDataItem* arg1A, const AbstrDataItem* arg2A, TAcc1Func acc1Func = TAcc1Func()) diff --git a/clc/dll/include/OperAccUniNum.h b/clc/dll/include/OperAccUniNum.h index 230b06ad3..538612545 100644 --- a/clc/dll/include/OperAccUniNum.h +++ b/clc/dll/include/OperAccUniNum.h @@ -88,8 +88,8 @@ namespace OperAccUniNum }; private: - tl_oper::inst_tuple, AbstrOperGroup*> m_TotlAggrOpers; - tl_oper::inst_tuple, AbstrOperGroup*> m_PartAggrOpers; + tl_oper::inst_tuple_templ m_TotlAggrOpers; + tl_oper::inst_tuple_templ m_PartAggrOpers; }; } diff --git a/clc/dll/src/BoostBlas.cpp b/clc/dll/src/BoostBlas.cpp index 831b54fa4..2f7d49a4f 100644 --- a/clc/dll/src/BoostBlas.cpp +++ b/clc/dll/src/BoostBlas.cpp @@ -382,9 +382,9 @@ class MatrInvOperator : public AbstrMatrInvOperator namespace { - tl_oper::inst_tuple> matrMulOperators; - tl_oper::inst_tuple> matrCovOperators; - tl_oper::inst_tuple> matrInvOperators; + tl_oper::inst_tuple_templ matrMulOperators; + tl_oper::inst_tuple_templ matrCovOperators; + tl_oper::inst_tuple_templ matrInvOperators; } diff --git a/clc/dll/src/ClassBreak.cpp b/clc/dll/src/ClassBreak.cpp index 93bd43542..d45d6ef44 100644 --- a/clc/dll/src/ClassBreak.cpp +++ b/clc/dll/src/ClassBreak.cpp @@ -119,7 +119,7 @@ namespace ClassifyFixedOperator cfoNZJF, cfoCRJF; }; - tl_oper::inst_tuple> classBreakInstances; + tl_oper::inst_tuple_templ classBreakInstances; } // end anonymous namespace /******************************************************************************/ diff --git a/clc/dll/src/Classify.cpp b/clc/dll/src/Classify.cpp index ca1e7b32e..b596f6b07 100644 --- a/clc/dll/src/Classify.cpp +++ b/clc/dll/src/Classify.cpp @@ -23,6 +23,6 @@ struct ClassifyOperator : SearchIndexOperatorImpl namespace { - tl_oper::inst_tuple> classifyInstances; + tl_oper::inst_tuple_templ classifyInstances; } // end anonymous namespace diff --git a/clc/dll/src/Cumulate.cpp b/clc/dll/src/Cumulate.cpp index acf0811cf..1389e52cb 100644 --- a/clc/dll/src/Cumulate.cpp +++ b/clc/dll/src/Cumulate.cpp @@ -304,7 +304,9 @@ namespace Cumulate private: CumulateTot m_AggrTotlOperator; - tl_oper::inst_tuple, AbstrOperGroup*> + template using CumulatePartThis = CumulatePart; + + tl_oper::inst_tuple_templ m_AggrPartOperator; }; @@ -320,7 +322,9 @@ namespace Cumulate {} private: - tl_oper::inst_tuple, IniAssigner>, AbstrOperGroup*> + template using ThisCumulOperInstances = CumulOperInstances, IniAssigner>; + + tl_oper::inst_tuple_templ m_AggrOperators; }; diff --git a/clc/dll/src/ID.cpp b/clc/dll/src/ID.cpp index ed6928f23..2a101c947 100644 --- a/clc/dll/src/ID.cpp +++ b/clc/dll/src/ID.cpp @@ -120,7 +120,7 @@ class IDOperator : public AbstrIDOperator namespace { - tl_oper::inst_tuple > + tl_oper::inst_tuple_templ operInstances; } // end anonymous namespace diff --git a/clc/dll/src/Index.cpp b/clc/dll/src/Index.cpp index 8cc2d1164..8bc7bc234 100644 --- a/clc/dll/src/Index.cpp +++ b/clc/dll/src/Index.cpp @@ -332,6 +332,6 @@ namespace SubIndexOperator m_SubIndex; }; - tl_oper::inst_tuple > indexOperators; - tl_oper::inst_tuple > ordinalOperators; + tl_oper::inst_tuple_templ indexOperators; + tl_oper::inst_tuple_templ ordinalOperators; } // end anonymous namespace diff --git a/clc/dll/src/Invert.cpp b/clc/dll/src/Invert.cpp index 9813ac4f2..bedd0d679 100644 --- a/clc/dll/src/Invert.cpp +++ b/clc/dll/src/Invert.cpp @@ -219,6 +219,6 @@ class InvertOperator : public AbstrInvertOperator }; - tl_oper::inst_tuple > invertOperators; + tl_oper::inst_tuple_templ invertOperators; } // end anonymous namespace diff --git a/clc/dll/src/OperAttrBin.cpp b/clc/dll/src/OperAttrBin.cpp index 74694bc87..2cec8ab26 100644 --- a/clc/dll/src/OperAttrBin.cpp +++ b/clc/dll/src/OperAttrBin.cpp @@ -404,8 +404,13 @@ struct BinaryAttrFuncOper : BinaryAttrOper class MetaFunc> struct BinaryInstantiation{ - using OperTemplate = BinaryAttrFuncOper > ; - tl_oper::inst_tuple m_OperList; + + template struct OperTemplate : BinaryAttrFuncOper > + { + using BinaryAttrFuncOper >::BinaryAttrFuncOper; // >; // inherit constructors + }; + + tl_oper::inst_tuple_templ m_OperList; BinaryInstantiation(AbstrOperGroup* gr) : m_OperList(gr) @@ -600,5 +605,5 @@ namespace { CommonOperGroup cogStrCount("strcount"); BinaryAttrFuncOper g_StrCountU(&cogStrCount); - tl_oper::inst_tuple > string2Opers; + tl_oper::inst_tuple_templ string2Opers; } // namespace diff --git a/clc/dll/src/OperAttrTer.cpp b/clc/dll/src/OperAttrTer.cpp index 5b06150f6..b832cefbc 100644 --- a/clc/dll/src/OperAttrTer.cpp +++ b/clc/dll/src/OperAttrTer.cpp @@ -323,8 +323,8 @@ namespace DualTernaryAttrOperator > m_OperData; }; - tl_oper::inst_tuple> s_iifOperators; - tl_oper::inst_tuple> s_rgbOperators; + tl_oper::inst_tuple_templ s_iifOperators; + tl_oper::inst_tuple_templ s_rgbOperators; DualTernaryAttrOperator s_subStrOperatorU (&cog_substr); diff --git a/clc/dll/src/OperAttrUni.cpp b/clc/dll/src/OperAttrUni.cpp index 5b1aa8ed0..df96ca6e1 100644 --- a/clc/dll/src/OperAttrUni.cpp +++ b/clc/dll/src/OperAttrUni.cpp @@ -183,5 +183,5 @@ namespace INST(rtrim); #undef INST - tl_oper::inst_tuple, AbstrOperGroup*> g_UnitSqrtOper(&cog_sqrt); + tl_oper::inst_tuple_templ g_UnitSqrtOper(&cog_sqrt); } diff --git a/clc/dll/src/OperUnit.cpp b/clc/dll/src/OperUnit.cpp index ab5fee6c6..a7e842895 100644 --- a/clc/dll/src/OperUnit.cpp +++ b/clc/dll/src/OperUnit.cpp @@ -1149,14 +1149,14 @@ namespace }; CommonOperGroup cog_NrOfRows("NrOfRows"); - tl_oper::inst_tuple, AbstrOperGroup* > nrOfRowsOpers(&cog_NrOfRows); + tl_oper::inst_tuple_templ nrOfRowsOpers(&cog_NrOfRows); - tl_oper::inst_tuple > tiledDomainOpers; + tl_oper::inst_tuple_templ tiledDomainOpers; - tl_oper::inst_tuple > unitRangeOpers; - tl_oper::inst_tuple > unitFixedRangeOpers; + tl_oper::inst_tuple_templ unitRangeOpers; + tl_oper::inst_tuple_templ unitFixedRangeOpers; - tl_oper::inst_tuple, AbstrOperGroup*, bool> unitCatRangeOpers(&cog_CatRange, true); + tl_oper::inst_tuple_templ unitCatRangeOpers(&cog_CatRange, true); CommonOperGroup cog_combine("combine", oper_policy::allow_extra_args); CommonOperGroup cog_combine08("combine_uint8", oper_policy::allow_extra_args); diff --git a/clc/dll/src/PCount.cpp b/clc/dll/src/PCount.cpp index 615c4e5f8..b1839d6da 100644 --- a/clc/dll/src/PCount.cpp +++ b/clc/dll/src/PCount.cpp @@ -241,11 +241,11 @@ namespace { }; }; - tl_oper::inst_tuple::Operator<_>, AbstrOperGroup& > partCountOpers(cog_pcount); - tl_oper::inst_tuple::Operator<_>, AbstrOperGroup& > partCountOpers8(cog_pcount_uint8); - tl_oper::inst_tuple::Operator<_>, AbstrOperGroup& > partCountOpers16(cog_pcount_uint16); - tl_oper::inst_tuple::Operator<_>, AbstrOperGroup& > partCountOpers32(cog_pcount_uint32); - tl_oper::inst_tuple::Operator<_>, AbstrOperGroup& > partCountOpers64(cog_pcount_uint64); + tl_oper::inst_tuple_templ::Operator, AbstrOperGroup& > partCountOpers(cog_pcount); + tl_oper::inst_tuple_templ::Operator, AbstrOperGroup& > partCountOpers8(cog_pcount_uint8); + tl_oper::inst_tuple_templ::Operator, AbstrOperGroup& > partCountOpers16(cog_pcount_uint16); + tl_oper::inst_tuple_templ::Operator, AbstrOperGroup& > partCountOpers32(cog_pcount_uint32); + tl_oper::inst_tuple_templ::Operator, AbstrOperGroup& > partCountOpers64(cog_pcount_uint64); tl_oper::inst_tuple, AbstrOperGroup& > hasAnyOpers(cog_has_any); } // end anonymous namespace diff --git a/clc/dll/src/RLookup.cpp b/clc/dll/src/RLookup.cpp index 2b41bc349..ad26ed26e 100644 --- a/clc/dll/src/RLookup.cpp +++ b/clc/dll/src/RLookup.cpp @@ -29,7 +29,7 @@ namespace // INSTANTIATION // ***************************************************************************** - tl_oper::inst_tuple> rlookupInstances; + tl_oper::inst_tuple_templ rlookupInstances; } // end anonymous namespace diff --git a/clc/dll/src/Ramp.cpp b/clc/dll/src/Ramp.cpp index a222fccd8..33a07c31e 100644 --- a/clc/dll/src/Ramp.cpp +++ b/clc/dll/src/Ramp.cpp @@ -190,7 +190,7 @@ namespace RampOperator m_Ramp, m_RampOpen; }; - tl_oper::inst_tuple< typelists::numerics, RampLinearOperator<_> > + tl_oper::inst_tuple_templ< typelists::numerics, RampLinearOperator > operRampLinearInstances; RampOperator operRampRgb(&cog_rampRgb, true); diff --git a/clc/dll/src/Sort.cpp b/clc/dll/src/Sort.cpp index c35215536..6748f70a7 100644 --- a/clc/dll/src/Sort.cpp +++ b/clc/dll/src/Sort.cpp @@ -103,7 +103,7 @@ namespace CommonOperGroup cog_sort("sort"); - tl_oper::inst_tuple, AbstrOperGroup* > sortOperators(&cog_sort); + tl_oper::inst_tuple_templ sortOperators(&cog_sort); } // end anonymous namespace diff --git a/clc/dll/src/Subset.cpp b/clc/dll/src/Subset.cpp index 7c0c7e260..4c194ca92 100644 --- a/clc/dll/src/Subset.cpp +++ b/clc/dll/src/Subset.cpp @@ -784,8 +784,8 @@ namespace { CommonOperGroup cog_collect_by_cond(token::collect_by_cond); CommonOperGroup cog_recollect_by_cond(token::recollect_by_cond, oper_policy::allow_extra_args); - tl_oper::inst_tuple, AbstrOperGroup&> selectDataOperInstances(cog_select_data); - tl_oper::inst_tuple, AbstrOperGroup&> collectByCondOperInstances(cog_collect_by_cond); - tl_oper::inst_tuple, AbstrOperGroup&> recollectByCondOperInstances(cog_recollect_by_cond); + tl_oper::inst_tuple_templ selectDataOperInstances(cog_select_data); + tl_oper::inst_tuple_templ collectByCondOperInstances(cog_collect_by_cond); + tl_oper::inst_tuple_templ recollectByCondOperInstances(cog_recollect_by_cond); } diff --git a/clc/dll/src/Union.cpp b/clc/dll/src/Union.cpp index 3895645c6..f34db870d 100644 --- a/clc/dll/src/Union.cpp +++ b/clc/dll/src/Union.cpp @@ -383,7 +383,7 @@ namespace UnionDataOperator unionData; }; - tl_oper::inst_tuple > instUnionOpers; + tl_oper::inst_tuple_templ instUnionOpers; UnionUnitOperator unionUnit(cog_unionUnit); UnionUnitOperator unionUnit08(cog_unionUnit08); UnionUnitOperator unionUnit16(cog_unionUnit16); diff --git a/clc/dll/src/Unique.cpp b/clc/dll/src/Unique.cpp index cee41ebaf..54debdcc0 100644 --- a/clc/dll/src/Unique.cpp +++ b/clc/dll/src/Unique.cpp @@ -307,7 +307,7 @@ class UniqueOperator : public AbstrUniqueOperator namespace { - tl_oper::inst_tuple, AbstrOperGroup&, const UnitClass*> + tl_oper::inst_tuple_templ uniqueOperatorsXX(cog_unique, nullptr) , uniqueOperators64(cog_unique64, Unit::GetStaticClass()) , uniqueOperators32(cog_unique32, Unit::GetStaticClass()) diff --git a/clc/dll/src/lookup.cpp b/clc/dll/src/lookup.cpp index 9995480d2..b1594211f 100644 --- a/clc/dll/src/lookup.cpp +++ b/clc/dll/src/lookup.cpp @@ -249,19 +249,18 @@ namespace template struct lookup_instances { - using typefunc = - tl_oper::tuple_func< - tl::transform< - typelists::domain_elements - , LookupOperator<_, V> - > - , AbstrOperGroup& - >; - using type = typename typefunc::type; + template struct LookupVOperator : LookupOperator + { + using LookupOperator::LookupOperator; // inherit contructors; + }; + + tl_oper::inst_tuple_templ m_Operators; + + lookup_instances(AbstrOperGroup& aog) : m_Operators(aog) {} }; - tl_oper::inst_tuple, AbstrOperGroup&> operLookup(cog_lookup); - tl_oper::inst_tuple, AbstrOperGroup&> operCollectByOrgRel(cog_collect_by_org_rel); + tl_oper::inst_tuple_templ operLookup(cog_lookup); + tl_oper::inst_tuple_templ operCollectByOrgRel(cog_collect_by_org_rel); } // end anonymous namespace diff --git a/clc/dll/src/random.cpp b/clc/dll/src/random.cpp index c870ce695..82d435a20 100644 --- a/clc/dll/src/random.cpp +++ b/clc/dll/src/random.cpp @@ -344,5 +344,5 @@ namespace RndUniformOperator rndUniU32; RndUniformOperator rndUniU8; - tl_oper::inst_tuple > rndPermOperators; + tl_oper::inst_tuple_templ rndPermOperators; } diff --git a/geo/dll/src/BoostGeometry.cpp b/geo/dll/src/BoostGeometry.cpp index 2173123ad..c27c3ed07 100644 --- a/geo/dll/src/BoostGeometry.cpp +++ b/geo/dll/src/BoostGeometry.cpp @@ -968,16 +968,16 @@ struct OuterPolygonOperator : public AbstrOuterOperator namespace { - tl_oper::inst_tuple> simplifyLineStringOperators; - tl_oper::inst_tuple> simplifyMultiPolygonOperators; - tl_oper::inst_tuple> simplifyPolygonOperators; - tl_oper::inst_tuple> bufferPointOperators; - tl_oper::inst_tuple> bufferMultiPointOperators; - tl_oper::inst_tuple> bufferLineStringOperators; - tl_oper::inst_tuple> bufferPolygonOperators; - tl_oper::inst_tuple> bufferMultiPolygonOperators; - - tl_oper::inst_tuple> outerPolygonOperators; - tl_oper::inst_tuple> outerMultiPolygonOperators; + tl_oper::inst_tuple_templ simplifyLineStringOperators; + tl_oper::inst_tuple_templ simplifyMultiPolygonOperators; + tl_oper::inst_tuple_templ simplifyPolygonOperators; + tl_oper::inst_tuple_templ bufferPointOperators; + tl_oper::inst_tuple_templ bufferMultiPointOperators; + tl_oper::inst_tuple_templ bufferLineStringOperators; + tl_oper::inst_tuple_templ bufferPolygonOperators; + tl_oper::inst_tuple_templ bufferMultiPolygonOperators; + + tl_oper::inst_tuple_templ outerPolygonOperators; + tl_oper::inst_tuple_templ outerMultiPolygonOperators; } diff --git a/geo/dll/src/BoostPolygon.cpp b/geo/dll/src/BoostPolygon.cpp index 16cc17f50..ec569f323 100644 --- a/geo/dll/src/BoostPolygon.cpp +++ b/geo/dll/src/BoostPolygon.cpp @@ -1100,7 +1100,7 @@ namespace , m_Instances(std::pair(this, flags)) {} - tl_oper::inst_tuple, std::pair> + tl_oper::inst_tuple_templ> m_Instances; }; @@ -1147,8 +1147,8 @@ namespace {} }; - tl_oper::inst_tuple> polygonOverlayOperators; - tl_oper::inst_tuple> polygonConnectivityOperators; + tl_oper::inst_tuple_templ polygonOverlayOperators; + tl_oper::inst_tuple_templ polygonConnectivityOperators; PolyOperatorGroupss simple("", PolygonFlags()); PolyOperatorGroupsss f2 (SharedStr(""), PolygonFlags()); diff --git a/geo/dll/src/Canyon.cpp b/geo/dll/src/Canyon.cpp index 37a0c0b88..c69cf5f30 100644 --- a/geo/dll/src/Canyon.cpp +++ b/geo/dll/src/Canyon.cpp @@ -356,7 +356,7 @@ class CanyonOperator : public NonaryOperator namespace { - tl_oper::inst_tuple > canyonOperators; + tl_oper::inst_tuple_templ canyonOperators; } /******************************************************************************/ diff --git a/geo/dll/src/Connect.cpp b/geo/dll/src/Connect.cpp index e2a1f4c9f..055c74298 100644 --- a/geo/dll/src/Connect.cpp +++ b/geo/dll/src/Connect.cpp @@ -1345,7 +1345,7 @@ namespace SpatialIndexOper spatialIndex1; }; - tl_oper::inst_tuple > connectOperatorInstances; + tl_oper::inst_tuple_templ connectOperatorInstances; } /******************************************************************************/ diff --git a/geo/dll/src/Dijkstra.cpp b/geo/dll/src/Dijkstra.cpp index 5d251e23d..16877407b 100644 --- a/geo/dll/src/Dijkstra.cpp +++ b/geo/dll/src/Dijkstra.cpp @@ -1743,7 +1743,7 @@ class DijkstraMatrOperator : public VariadicOperator namespace { typedef boost::mpl::vector DistTypeList; // Int32 no longer supported as Impedance - typedef tl_oper::inst_tuple< DistTypeList, DijkstraMatrOperator<_>, AbstrOperGroup*, DijkstraFlag> DijkstraOperListType; + typedef tl_oper::inst_tuple_templ< DistTypeList, DijkstraMatrOperator, AbstrOperGroup*, DijkstraFlag> DijkstraOperListType; CommonOperGroup dsGroup("dijkstra_s", oper_policy::allow_extra_args); CommonOperGroup dm32Group("dijkstra_m", oper_policy::allow_extra_args); diff --git a/geo/dll/src/GridDist.cpp b/geo/dll/src/GridDist.cpp index c87e1f734..6a60447da 100644 --- a/geo/dll/src/GridDist.cpp +++ b/geo/dll/src/GridDist.cpp @@ -374,6 +374,6 @@ namespace struct GridDistOperSet : tl_oper::inst_tuple> {}; - tl_oper::inst_tuple> gridDistOperSets; + tl_oper::inst_tuple_templ gridDistOperSets; } diff --git a/geo/dll/src/OperPolygon.cpp b/geo/dll/src/OperPolygon.cpp index d5e864092..501e6958e 100644 --- a/geo/dll/src/OperPolygon.cpp +++ b/geo/dll/src/OperPolygon.cpp @@ -1961,9 +1961,9 @@ namespace }; - tl_oper::inst_tuple> seqOperPointInstances; - tl_oper::inst_tuple> seqOperNumericInstances; - tl_oper::inst_tuple> pointOperInstances; + tl_oper::inst_tuple_templ seqOperPointInstances; + tl_oper::inst_tuple_templ seqOperNumericInstances; + tl_oper::inst_tuple_templ pointOperInstances; } /******************************************************************************/ diff --git a/geo/dll/src/Perimeter.cpp b/geo/dll/src/Perimeter.cpp index a5ea50725..8ecc591ee 100644 --- a/geo/dll/src/Perimeter.cpp +++ b/geo/dll/src/Perimeter.cpp @@ -244,7 +244,7 @@ struct PerimeterOperators : PerimeterOperator namespace { - tl_oper::inst_tuple> perimeterOpers; + tl_oper::inst_tuple_templ perimeterOpers; } /******************************************************************************/ diff --git a/geo/dll/src/Point.cpp b/geo/dll/src/Point.cpp index f6e41c38f..4fd49303e 100644 --- a/geo/dll/src/Point.cpp +++ b/geo/dll/src/Point.cpp @@ -335,7 +335,7 @@ namespace UnaryAttrSpecialFuncOperator > ca2Col; }; // oper_arg_policy oap_point[3] = { oper_arg_policy::calc_as_result, oper_arg_policy::calc_as_result, oper_arg_policy::calc_never }; - tl_oper::inst_tuple > pointOpers; + tl_oper::inst_tuple_templ pointOpers; CommonOperGroup dist2("dist2"); Dist2Operator dist2Oper(&dist2); diff --git a/geo/dll/src/RegCount.cpp b/geo/dll/src/RegCount.cpp index f0a6028b9..c4d746848 100644 --- a/geo/dll/src/RegCount.cpp +++ b/geo/dll/src/RegCount.cpp @@ -317,7 +317,7 @@ struct RegCountOperators namespace { - tl_oper::inst_tuple > regCountOpers; + tl_oper::inst_tuple_templ regCountOpers; } // end anonymous namespace /******************************************************************************/ diff --git a/geo/dll/src/Voronoi.cpp b/geo/dll/src/Voronoi.cpp index b57fc139d..c6b919cac 100644 --- a/geo/dll/src/Voronoi.cpp +++ b/geo/dll/src/Voronoi.cpp @@ -269,7 +269,7 @@ namespace { CommonOperGroup cogTR("triangualize"); - tl_oper::inst_tuple, AbstrOperGroup*> trOPers(&cogTR); + tl_oper::inst_tuple_templ trOPers(&cogTR); } /******************************************************************************/ diff --git a/geo/dll/src/nth_element.cpp b/geo/dll/src/nth_element.cpp index 407eec0be..20038db75 100644 --- a/geo/dll/src/nth_element.cpp +++ b/geo/dll/src/nth_element.cpp @@ -824,5 +824,5 @@ namespace RthElementPart m_RPartOperator; }; - tl_oper::inst_tuple> s_PthElemOperators; + tl_oper::inst_tuple_templ s_PthElemOperators; } diff --git a/rtc/dll/src/geo/ElemTraits.h b/rtc/dll/src/geo/ElemTraits.h index 484de6692..2e200adfe 100644 --- a/rtc/dll/src/geo/ElemTraits.h +++ b/rtc/dll/src/geo/ElemTraits.h @@ -120,6 +120,9 @@ template struct is_integral > : std::true_type{}; // template <> struct is_integral : std::true_type {}; template constexpr bool is_integral_v = is_integral::value; +template +concept IntegralValue = is_integral_v && std::regular; + template struct is_simple : std::is_arithmetic {}; template <> struct is_simple : std::true_type {}; template <> struct is_simple : std::true_type {}; @@ -132,10 +135,14 @@ template <> struct is_numeric : std::true_type {}; template struct is_numeric > : std::true_type {}; template <> struct is_numeric > : std::false_type {}; // bit_value<1> (pseudo bool) is not considered as a numeric. + template <> struct is_numeric {}; // PREVENT USING bool directly template constexpr bool is_numeric_v = is_numeric::value; +template +concept NumericValue = is_numeric_v && std::regular; + template struct is_void : std::false_type {}; template <> struct is_void : std::true_type {}; template constexpr bool is_void_v = is_void::value; diff --git a/rtc/dll/src/geo/Point.h b/rtc/dll/src/geo/Point.h index f221b13fa..e0bd99b24 100644 --- a/rtc/dll/src/geo/Point.h +++ b/rtc/dll/src/geo/Point.h @@ -362,4 +362,17 @@ inline ReturnType SqrDist(PU p1, PU p2) return Norm(p1-p2); } +template struct is_fixed_size_element : is_numeric {}; +template struct is_fixed_size_element> : is_fixed_size_element {}; +template struct is_fixed_size_element> : is_fixed_size_element {}; + +template constexpr bool is_fixed_size_element_v = is_fixed_size_element::value; +template concept FixedSizeElement = is_fixed_size_element_v; + +template struct is_point_type : std::false_type {}; +template struct is_point_type> :std::true_type {}; + +template constexpr bool is_point_type_v = is_point_type::value; +template concept PointType = is_point_type_v; + #endif // __RTC_GEO_POINT_H diff --git a/rtc/dll/src/utl/TypeListOper.h b/rtc/dll/src/utl/TypeListOper.h index b7db6870a..772ef4ebd 100644 --- a/rtc/dll/src/utl/TypeListOper.h +++ b/rtc/dll/src/utl/TypeListOper.h @@ -69,24 +69,19 @@ namespace tl_oper U m_Second; }; }; + template