// -*- 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__*/