From ac1e78efa910cac81d104a92ec971d984dcd26a1 Mon Sep 17 00:00:00 2001 From: Wolfgang Draxinger Date: Thu, 4 Jul 2019 20:00:17 +0200 Subject: dwu::operators --- include/dwu/operators | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 include/dwu/operators (limited to 'include') diff --git a/include/dwu/operators b/include/dwu/operators new file mode 100644 index 0000000..daf2481 --- /dev/null +++ b/include/dwu/operators @@ -0,0 +1,80 @@ +// -*- C++ -*- +// +// Copyright (c) 2019 Wolfgang 'datenwolf' Draxinger +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +#pragma once +#ifndef DWU__OPERATORS__ +#define DWU__OPERATORS__ 1 + +#include +#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 std::move(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 std::move(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 std::move(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; \ +} +DWU_OPERATOR(+) +DWU_OPERATOR(-) +DWU_OPERATOR(*) +DWU_OPERATOR(/) +DWU_OPERATOR(%) +DWU_OPERATOR(^) +DWU_OPERATOR(&) +DWU_OPERATOR(|) +} } +#endif/*DWU__OPERATORS__*/ -- cgit v1.2.3