CNORXZ
Container with Native Operation Routines and Expressions
Loading...
Searching...
No Matches
basic_operations.cc.h
Go to the documentation of this file.
1// -*- C++ -*-
12#ifndef __cxz_basic_operations_cc_h__
13#define __cxz_basic_operations_cc_h__
14
15#include "basic_operations.h"
16
17namespace CNORXZ
18{
19 /*==================================+
20 | standard operatrions (unary) |
21 +==================================*/
22
23 template <class Op>
24 constexpr decltype(auto) minus(const COpInterface<Op>& op)
25 {
26 return operation( [](const auto& a) { return -a; }, op.THIS() );
27 }
28
29 /*===================================+
30 | standard operatrions (binary) |
31 +===================================*/
32
33 template <class Op1, class Op2>
34 constexpr decltype(auto) plus(const COpInterface<Op1>& op1, const COpInterface<Op2>& op2)
35 {
36 return operation( [](const auto& a, const auto& b) { return a + b; },
37 op1.THIS(), op2.THIS() );
38 }
39
40 template <class Op1, class Op2>
41 constexpr decltype(auto) minus(const COpInterface<Op1>& op1, const COpInterface<Op2>& op2)
42 {
43 return operation( [](const auto& a, const auto& b) { return a - b; },
44 op1.THIS(), op2.THIS() );
45 }
46
47 template <class Op1, class Op2>
48 constexpr decltype(auto) multiplies(const COpInterface<Op1>& op1, const COpInterface<Op2>& op2)
49 {
50 return operation( [](const auto& a, const auto& b) { return a * b; },
51 op1.THIS(), op2.THIS() );
52 }
53
54 template <class Op1, class Op2>
55 constexpr decltype(auto) divides(const COpInterface<Op1>& op1, const COpInterface<Op2>& op2)
56 {
57 return operation( [](const auto& a, const auto& b) { return a / b; },
58 op1.THIS(), op2.THIS() );
59 }
60
61 template <class Op1, class Op2>
62 constexpr decltype(auto) modulo(const COpInterface<Op1>& op1, const COpInterface<Op2>& op2)
63 {
64 return operation( [](const auto& a, const auto& b) { return a % b; },
65 op1.THIS(), op2.THIS() );
66 }
67
68 /*=======================================+
69 | operators for standard operations |
70 +=======================================*/
71
72 template <class Op>
73 constexpr decltype(auto) operator-(const COpInterface<Op>& op)
74 {
75 return minus(op);
76 }
77
78 template <class Op1, class Op2>
79 constexpr decltype(auto) operator+(const COpInterface<Op1>& op1, const COpInterface<Op2>& op2)
80 {
81 return plus(op1, op2);
82 }
83
84 template <class Op1, class Op2>
85 constexpr decltype(auto) operator-(const COpInterface<Op1>& op1, const COpInterface<Op2>& op2)
86 {
87 return minus(op1, op2);
88 }
89
90 template <class Op1, class Op2>
91 constexpr decltype(auto) operator*(const COpInterface<Op1>& op1, const COpInterface<Op2>& op2)
92 {
93 return multiplies(op1, op2);
94 }
95
96 template <class Op1, class Op2>
97 constexpr decltype(auto) operator/(const COpInterface<Op1>& op1, const COpInterface<Op2>& op2)
98 {
99 return divides(op1, op2);
100 }
101
102 template <class Op1, class Op2>
103 constexpr decltype(auto) operator%(const COpInterface<Op1>& op1, const COpInterface<Op2>& op2)
104 {
105 return modulo(op1, op2);
106 }
107}
108
109#endif
Basic operations declaration.
constexpr decltype(auto) multiplies(const COpInterface< Op1 > &op1, const COpInterface< Op2 > &op2)
constexpr decltype(auto) minus(const COpInterface< Op > &op)
constexpr decltype(auto) modulo(const COpInterface< Op1 > &op1, const COpInterface< Op2 > &op2)
Sptr< Range > rangeCast(const RangePtr r)
constexpr decltype(auto) divides(const COpInterface< Op1 > &op1, const COpInterface< Op2 > &op2)
constexpr decltype(auto) plus(const COpInterface< Op1 > &op1, const COpInterface< Op2 > &op2)
constexpr decltype(auto) operation(F &&f, const Ops &... ops)