diff options
author | Wolfgang Draxinger <dw@optores.de> | 2019-07-18 13:55:27 +0200 |
---|---|---|
committer | Wolfgang Draxinger <dw@optores.de> | 2019-07-18 13:55:27 +0200 |
commit | d31ad46b724953e6895dc087aa38c92e939b6c78 (patch) | |
tree | 257566a57e87a01406aa4de3c051a623780f75f3 /include | |
parent | c3acd51557d6c1d41565acaab2966b193d573230 (diff) | |
download | dwu-d31ad46b724953e6895dc087aa38c92e939b6c78.tar.gz dwu-d31ad46b724953e6895dc087aa38c92e939b6c78.tar.bz2 |
split off mixed type/container operators into dedicated namespaces
Diffstat (limited to 'include')
-rw-r--r-- | include/dwu/operators | 181 |
1 files changed, 130 insertions, 51 deletions
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 <algorithm> -namespace dwu { namespace operators { -#define DWU_OPERATOR(O) \ -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(); \ - while( vi != v.end() ){ \ - *vi++ = *li++ O r; \ - } \ - return v; \ -} \ -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(); \ - while( vi != v.end() ){ \ - *vi++ = l O *ri++; \ - } \ - return v; \ -} \ -template<template<typename,typename> class Cl, template<typename,typename> class Cr, 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 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; \ -} \ -template<template<typename,typename> class Cl, template<typename,typename> class Cr, typename Tl, typename Al, typename Tr, typename Ar> \ -Cl<Tl,Al>& operator O##= (Cl<Tl,Al> &l, Cr<Tr,Ar> 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<template<typename,typename> class C, typename T, typename A> \ + C<T,A> operator O (C<T,A> const &l, T const &r) { \ + C<T,A> v(l.size()); \ + auto vi = v.begin(); auto li = l.begin(); \ + while( vi != v.end() ){ \ + *vi++ = *li++ O r; \ + } \ + return v; \ + } \ + template<template<typename,typename> class C, typename T, typename A> \ + C<T,A> operator O (T const &l, C<T,A> const &r) { \ + C<T,A> v(r.size()); \ + auto vi = v.begin(); auto ri = r.begin(); \ + while( vi != v.end() ){ \ + *vi++ = l O *ri++; \ + } \ + return v; \ + } \ + 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 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 T, typename A> \ + C<T,A>& operator O##= (C<T,A> &l, T const &r){ \ + for(auto &x:l){ x O##= r; } \ + return l; \ + } \ + template<template<typename,typename> class C, typename T, typename A> \ + C<T,A>& operator O##= (C<T,A> &l, C<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(+) +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<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(); \ + while( vi != v.end() ){ \ + *vi++ = *li++ O r; \ + } \ + return v; \ + } \ + 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(); \ + while( vi != v.end() ){ \ + *vi++ = l 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; \ + } +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<typename,typename> class Cl, \ + template<typename,typename> class Cr, \ + 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 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 Tl, typename Al, \ + typename Tr, typename Ar > \ + Cl<Tl,Al>& operator O##= (Cl<Tl,Al> &l, Cr<Tr,Ar> 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__*/ |