summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWolfgang Draxinger <dw@optores.de>2019-07-04 20:00:17 +0200
committerWolfgang Draxinger <dw@optores.de>2019-07-04 20:00:17 +0200
commitac1e78efa910cac81d104a92ec971d984dcd26a1 (patch)
tree98c2a1875cbf84e0070bc457efb4cfbf3f701eb0
downloaddwu-ac1e78efa910cac81d104a92ec971d984dcd26a1.tar.gz
dwu-ac1e78efa910cac81d104a92ec971d984dcd26a1.tar.bz2
dwu::operators
-rw-r--r--COPYING19
-rw-r--r--example/Makefile8
-rw-r--r--example/operators.cc45
-rw-r--r--include/dwu/operators80
4 files changed, 152 insertions, 0 deletions
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..7fc0dcf
--- /dev/null
+++ b/COPYING
@@ -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__*/