diff options
author | Wolfgang Draxinger <dw@optores.de> | 2019-07-18 14:14:00 +0200 |
---|---|---|
committer | Wolfgang Draxinger <dw@optores.de> | 2019-07-18 14:14:00 +0200 |
commit | 64bd8f2702abbd1758eeab499139e2eb0ef820ab (patch) | |
tree | 6f6cf6ca70a07516c9e6008c85131341bcdb5731 | |
parent | d31ad46b724953e6895dc087aa38c92e939b6c78 (diff) | |
download | dwu-64bd8f2702abbd1758eeab499139e2eb0ef820ab.tar.gz dwu-64bd8f2702abbd1758eeab499139e2eb0ef820ab.tar.bz2 |
added mixed containers same type support
-rw-r--r-- | include/dwu/operators | 70 |
1 files 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 <algorithm> - namespace dwu { namespace operators { // same container, same type @@ -49,7 +47,8 @@ namespace dwu { } \ template<template<typename,typename> class C, typename T, typename A> \ C<T,A> operator O (C<T,A> const &l, C<T,A> const &r) { \ - C<T,A> v( std::min(l.size(), r.size()) ); \ + auto const lsz = l.size(); auto const rsz = r.size(); \ + C<T,A> 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<template<typename,typename> class C, typename Tl, typename A, typename Tr> \ + template< \ + template<typename,typename> class C, \ + typename Tl, typename A, typename Tr > \ C<Tl,A> operator O (C<Tl,A> const &l, Tr const &r) { \ C<Tl,A> v(l.size()); \ auto vi = v.begin(); auto li = l.begin(); \ @@ -92,7 +93,9 @@ DWU_OPERATORS(|) } \ return v; \ } \ - template<template<typename,typename> class C, typename Tl, typename A, typename Tr> \ + template< \ + template<typename,typename> class C, \ + typename Tl, typename A, typename Tr > \ C<Tr,A> operator O (Tl const &l, C<Tr,A> const &r) { \ C<Tr,A> v(r.size()); \ auto vi = v.begin(); auto ri = r.begin(); \ @@ -101,7 +104,21 @@ DWU_OPERATORS(|) } \ return v; \ } \ - template<template<typename,typename> class C, typename Tl, typename A, typename Tr> \ + template< \ + template<typename,typename> class C, \ + typename Tl, typename A, typename Tr > \ + C<Tl,A> operator O (C<Tl,A> const &l, C<Tr,A> const &r) { \ + auto const lsz = l.size(); auto const rsz = r.size(); \ + C<Tl,A> 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<typename,typename> class C, \ + typename Tl, typename A, typename Tr > \ C<Tl,A>& operator O##= (C<Tl,A> &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<typename,typename> class Cl, \ + template<typename,typename> class Cr, \ + typename T, typename A > \ + Cl<T,A> operator O (Cl<T,A> const &l, Cr<T,A> const &r) { \ + auto const lsz = l.size(); auto const rsz = r.size(); \ + Cl<T,A> 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<typename,typename> class Cl, \ + template<typename,typename> class Cr, \ + typename T, typename A > \ + Cl<T,A>& operator O##= (Cl<T,A> &l, Cr<T,A> 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<Tl,Al> operator O (Cl<Tl,Al> const &l, Cr<Tr,Ar> const &r) { \ - Cl<Tl,Al> v( std::min(l.size(), r.size()) ); \ + auto const lsz = l.size(); auto const rsz = r.size(); \ + Cl<Tl,Al> 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++; \ |