From d31ad46b724953e6895dc087aa38c92e939b6c78 Mon Sep 17 00:00:00 2001 From: Wolfgang Draxinger Date: Thu, 18 Jul 2019 13:55:27 +0200 Subject: split off mixed type/container operators into dedicated namespaces --- example/operators.cc | 11 +-- include/dwu/operators | 181 ++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 137 insertions(+), 55 deletions(-) diff --git a/example/operators.cc b/example/operators.cc index d225303..14fa00b 100644 --- a/example/operators.cc +++ b/example/operators.cc @@ -36,11 +36,14 @@ int main(int argc, char *argv[]) auto vd = vb * vc; dump("vd = vb * vc: ", vd); - std::list la = {100, 101, 101, 103, 104, 105}; - dump("la: ", la); + { + using namespace dwu::operators_xcxt; + std::list la = {100, 101, 101, 103, 104, 105}; + dump("la: ", la); - auto rr = la - vd; - dump("rr = la - vd: ", rr); + auto rr = la - vd; + dump("rr = la - vd: ", rr); + } return 0; } diff --git a/include/dwu/operators b/include/dwu/operators index 7100301..b4b5210 100644 --- a/include/dwu/operators +++ b/include/dwu/operators @@ -25,56 +25,135 @@ #include -namespace dwu { namespace operators { -#define DWU_OPERATOR(O) \ -template class C, typename Tl, typename A, typename Tr> \ -C operator O (C const &l, Tr const &r) { \ - C v(l.size()); \ - auto vi = v.begin(); auto li = l.begin(); \ - while( vi != v.end() ){ \ - *vi++ = *li++ O r; \ - } \ - return v; \ -} \ -template class C, typename Tl, typename A, typename Tr> \ -C operator O (Tl const &l, C const &r) { \ - C v(r.size()); \ - auto vi = v.begin(); auto ri = r.begin(); \ - while( vi != v.end() ){ \ - *vi++ = l O *ri++; \ - } \ - return v; \ -} \ -template class Cl, template class Cr, typename Tl, typename Al, typename Tr, typename Ar> \ -Cl operator O (Cl const &l, Cr const &r) { \ - Cl v( std::min(l.size(), r.size()) ); \ - auto vi = v.begin(); auto li = l.begin(); auto ri = r.begin(); \ - while( vi != v.end() ){ \ - *vi++ = *li++ O *ri++; \ - } \ - return v; \ -} \ -template class C, typename Tl, typename A, typename Tr> \ -C& operator O##= (C &l, Tr const &r){ \ - for(auto &x:l){ x O##= r; } \ - return l; \ -} \ -template class Cl, template class Cr, typename Tl, typename Al, typename Tr, typename Ar> \ -Cl& operator O##= (Cl &l, Cr const &r){ \ - auto li = l.begin(); auto ri = r.begin(); \ - while( li != l.end() && ri != r.end() ){ \ - *li++ O##= *ri++; \ - } \ - return l; \ +namespace dwu { + namespace operators { + // same container, same type +#define DWU_OPERATORS(O) \ + template class C, typename T, typename A> \ + C operator O (C const &l, T const &r) { \ + C v(l.size()); \ + auto vi = v.begin(); auto li = l.begin(); \ + while( vi != v.end() ){ \ + *vi++ = *li++ O r; \ + } \ + return v; \ + } \ + template class C, typename T, typename A> \ + C operator O (T const &l, C const &r) { \ + C v(r.size()); \ + auto vi = v.begin(); auto ri = r.begin(); \ + while( vi != v.end() ){ \ + *vi++ = l O *ri++; \ + } \ + return v; \ + } \ + template class C, typename T, typename A> \ + C operator O (C const &l, C const &r) { \ + C v( std::min(l.size(), r.size()) ); \ + auto vi = v.begin(); auto li = l.begin(); auto ri = r.begin(); \ + while( vi != v.end() ){ \ + *vi++ = *li++ O *ri++; \ + } \ + return v; \ + } \ + template class C, typename T, typename A> \ + C& operator O##= (C &l, T const &r){ \ + for(auto &x:l){ x O##= r; } \ + return l; \ + } \ + template class C, typename T, typename A> \ + C& operator O##= (C &l, C const &r){ \ + auto li = l.begin(); auto ri = r.begin(); \ + while( li != l.end() && ri != r.end() ){ \ + *li++ O##= *ri++; \ + } \ + return l; \ + } +DWU_OPERATORS(+) +DWU_OPERATORS(-) +DWU_OPERATORS(*) +DWU_OPERATORS(/) +DWU_OPERATORS(%) +DWU_OPERATORS(^) +DWU_OPERATORS(&) +DWU_OPERATORS(|) +#undef DWU_OPERATORS + } + + namespace operators_xt { + // same container, mixed type +#define DWU_OPERATORS_XT(O) \ + template class C, typename Tl, typename A, typename Tr> \ + C operator O (C const &l, Tr const &r) { \ + C v(l.size()); \ + auto vi = v.begin(); auto li = l.begin(); \ + while( vi != v.end() ){ \ + *vi++ = *li++ O r; \ + } \ + return v; \ + } \ + template class C, typename Tl, typename A, typename Tr> \ + C operator O (Tl const &l, C const &r) { \ + C v(r.size()); \ + auto vi = v.begin(); auto ri = r.begin(); \ + while( vi != v.end() ){ \ + *vi++ = l O *ri++; \ + } \ + return v; \ + } \ + template class C, typename Tl, typename A, typename Tr> \ + C& operator O##= (C &l, Tr const &r){ \ + for(auto &x:l){ x O##= r; } \ + return l; \ + } +DWU_OPERATORS_XT(+) +DWU_OPERATORS_XT(-) +DWU_OPERATORS_XT(*) +DWU_OPERATORS_XT(/) +DWU_OPERATORS_XT(%) +DWU_OPERATORS_XT(^) +DWU_OPERATORS_XT(&) +DWU_OPERATORS_XT(|) +#undef DWU_OPERATORS_XT + } + + namespace operators_xcxt { + // mixed container, mixed type +#define DWU_OPERATORS_XCXT(O) \ + template< \ + template class Cl, \ + template class Cr, \ + typename Tl, typename Al, \ + typename Tr, typename Ar > \ + Cl operator O (Cl const &l, Cr const &r) { \ + Cl v( std::min(l.size(), r.size()) ); \ + auto vi = v.begin(); auto li = l.begin(); auto ri = r.begin(); \ + while( vi != v.end() ){ \ + *vi++ = *li++ O *ri++; \ + } \ + return v; \ + } \ + template< \ + template class Cl, \ + template class Cr, \ + typename Tl, typename Al, \ + typename Tr, typename Ar > \ + Cl& operator O##= (Cl &l, Cr const &r){ \ + auto li = l.begin(); auto ri = r.begin(); \ + while( li != l.end() && ri != r.end() ){ \ + *li++ O##= *ri++; \ + } \ + return l; \ + } +DWU_OPERATORS_XCXT(+) +DWU_OPERATORS_XCXT(-) +DWU_OPERATORS_XCXT(*) +DWU_OPERATORS_XCXT(/) +DWU_OPERATORS_XCXT(%) +DWU_OPERATORS_XCXT(^) +DWU_OPERATORS_XCXT(&) +DWU_OPERATORS_XCXT(|) +#undef DWU_OPERATORS_XCXT + } } -DWU_OPERATOR(+) -DWU_OPERATOR(-) -DWU_OPERATOR(*) -DWU_OPERATOR(/) -DWU_OPERATOR(%) -DWU_OPERATOR(^) -DWU_OPERATOR(&) -DWU_OPERATOR(|) -} } -#undef DWU_OPERATOR #endif/*DWU__OPERATORS__*/ -- cgit v1.2.3