From 64bd8f2702abbd1758eeab499139e2eb0ef820ab Mon Sep 17 00:00:00 2001 From: Wolfgang Draxinger Date: Thu, 18 Jul 2019 14:14:00 +0200 Subject: added mixed containers same type support --- include/dwu/operators | 70 +++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 63 insertions(+), 7 deletions(-) diff --git a/include/dwu/operators b/include/dwu/operators index b4b5210..bb52a57 100644 --- a/include/dwu/operators +++ b/include/dwu/operators @@ -23,8 +23,6 @@ #ifndef DWU__OPERATORS__ #define DWU__OPERATORS__ 1 -#include - namespace dwu { namespace operators { // same container, same type @@ -49,7 +47,8 @@ namespace dwu { } \ 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 const lsz = l.size(); auto const rsz = r.size(); \ + C v( (lsz < rsz) ? lsz : rsz ); \ auto vi = v.begin(); auto li = l.begin(); auto ri = r.begin(); \ while( vi != v.end() ){ \ *vi++ = *li++ O *ri++; \ @@ -83,7 +82,9 @@ DWU_OPERATORS(|) namespace operators_xt { // same container, mixed type #define DWU_OPERATORS_XT(O) \ - template class C, typename Tl, typename A, typename Tr> \ + template< \ + 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(); \ @@ -92,7 +93,9 @@ DWU_OPERATORS(|) } \ return v; \ } \ - template class C, typename Tl, typename A, typename Tr> \ + template< \ + 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(); \ @@ -101,7 +104,21 @@ DWU_OPERATORS(|) } \ return v; \ } \ - template class C, typename Tl, typename A, typename Tr> \ + template< \ + template class C, \ + typename Tl, typename A, typename Tr > \ + C operator O (C const &l, C const &r) { \ + auto const lsz = l.size(); auto const rsz = r.size(); \ + C v( (lsz < rsz) ? lsz : rsz ); \ + 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 C, \ + typename Tl, typename A, typename Tr > \ C& operator O##= (C &l, Tr const &r){ \ for(auto &x:l){ x O##= r; } \ return l; \ @@ -117,6 +134,44 @@ DWU_OPERATORS_XT(|) #undef DWU_OPERATORS_XT } + namespace operators_xc { + // mixed container, same type +#define DWU_OPERATORS_XC(O) \ + template< \ + template class Cl, \ + template class Cr, \ + typename T, typename A > \ + Cl operator O (Cl const &l, Cr const &r) { \ + auto const lsz = l.size(); auto const rsz = r.size(); \ + Cl v( (lsz < rsz) ? lsz : rsz ); \ + 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 T, typename A > \ + 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_XC(+) +DWU_OPERATORS_XC(-) +DWU_OPERATORS_XC(*) +DWU_OPERATORS_XC(/) +DWU_OPERATORS_XC(%) +DWU_OPERATORS_XC(^) +DWU_OPERATORS_XC(&) +DWU_OPERATORS_XC(|) +#undef DWU_OPERATORS_XC + } + namespace operators_xcxt { // mixed container, mixed type #define DWU_OPERATORS_XCXT(O) \ @@ -126,7 +181,8 @@ DWU_OPERATORS_XT(|) 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 const lsz = l.size(); auto const rsz = r.size(); \ + Cl v( (lsz < rsz) ? lsz : rsz ); \ auto vi = v.begin(); auto li = l.begin(); auto ri = r.begin(); \ while( vi != v.end() ){ \ *vi++ = *li++ O *ri++; \ -- cgit v1.2.3