diff options
author | Wolfgang Draxinger <dw@optores.de> | 2019-07-04 20:00:17 +0200 |
---|---|---|
committer | Wolfgang Draxinger <dw@optores.de> | 2019-07-04 20:00:17 +0200 |
commit | ac1e78efa910cac81d104a92ec971d984dcd26a1 (patch) | |
tree | 98c2a1875cbf84e0070bc457efb4cfbf3f701eb0 | |
download | dwu-ac1e78efa910cac81d104a92ec971d984dcd26a1.tar.gz dwu-ac1e78efa910cac81d104a92ec971d984dcd26a1.tar.bz2 |
dwu::operators
-rw-r--r-- | COPYING | 19 | ||||
-rw-r--r-- | example/Makefile | 8 | ||||
-rw-r--r-- | example/operators.cc | 45 | ||||
-rw-r--r-- | include/dwu/operators | 80 |
4 files changed, 152 insertions, 0 deletions
@@ -0,0 +1,19 @@ +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. diff --git a/example/Makefile b/example/Makefile new file mode 100644 index 0000000..f26d3df --- /dev/null +++ b/example/Makefile @@ -0,0 +1,8 @@ +CXXFLAGS+=-I../include + +.PHONY: all + +all: operators + +operators: CC=$(CXX) +operators: operators.o diff --git a/example/operators.cc b/example/operators.cc new file mode 100644 index 0000000..cfcd529 --- /dev/null +++ b/example/operators.cc @@ -0,0 +1,45 @@ +#include <iostream> + +#include <vector> +#include <list> + +#include <dwu/operators> + +template<class S, class T> +static void dump(S const &s, T const &v) +{ + std::cout << s << '{'; + for( auto const &x : v ){ + std::cout << x << ", "; + } + std::cout << '}' << std::endl; +} + +int main(int argc, char *argv[]) +{ + using namespace dwu::operators; + + std::vector<int> va = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + dump("va: ", va); + + auto vb = va + 10; + auto vc = 20 + va; + dump("vb = va + 10: ", vb); + dump("vc = 20 + va: ", vc); + + vb += 30; + dump("vb += 30: ", vb); + vc -= 40; + dump("vc -= 40: ", vc); + + auto vd = vb * vc; + dump("vd = vb * vc: ", vd); + + std::list<float> la = {100, 101, 101, 103, 104, 105}; + dump("la: ", la); + + auto rr = la - vd; + dump("rr = la - vd: ", rr); + + return 0; +} 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 @@ +// <dwu/operators> -*- 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 <algorithm> +#include <utility> + +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 std::move(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 std::move(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 std::move(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; \ +} +DWU_OPERATOR(+) +DWU_OPERATOR(-) +DWU_OPERATOR(*) +DWU_OPERATOR(/) +DWU_OPERATOR(%) +DWU_OPERATOR(^) +DWU_OPERATOR(&) +DWU_OPERATOR(|) +} } +#endif/*DWU__OPERATORS__*/ |