dl
dl_type_op.h
浏览该文件的文档.
1
12#pragma once
13
14#include <array>
15#include <cstdint>
16#include <vector>
17
18namespace dl
19{
20//------------------------------N op N------------------------
21template<typename T, std::size_t N>
23{
24 for (std::size_t i = 0; i < N; ++i)
25 a[i] += b[i];
26 return a;
27}
28
29template<typename T, std::size_t N>
30constexpr Array<T, N> operator+(const Array<T, N>& a, const Array<T, N>& b)
31{
32 Array<T, N> ret = a;
33 return ret += b;
34}
35
36template<typename T, std::size_t N>
38{
39 for (std::size_t i = 0; i < N; ++i)
40 a[i] -= b[i];
41 return a;
42}
43
44template<typename T, std::size_t N>
45constexpr Array<T, N> operator-(const Array<T, N>& a, const Array<T, N>& b)
46{
47 Array<T, N> ret = a;
48 return ret -= b;
49}
50
51template<typename T, std::size_t N>
53{
54 for (std::size_t i = 0; i < N; ++i)
55 a[i] *= b[i];
56 return a;
57}
58
59template<typename T, std::size_t N>
60constexpr Array<T, N> operator*(const Array<T, N>& a, const Array<T, N>& b)
61{
62 Array<T, N> ret = a;
63 return ret *= b;
64}
65
66template<typename T, std::size_t N>
68{
69 for (std::size_t i = 0; i < N; ++i)
70 a[i] /= b[i];
71 return a;
72}
73
74template<typename T, std::size_t N>
75constexpr Array<T, N> operator/(const Array<T, N>& a, const Array<T, N>& b)
76{
77 Array<T, N> ret = a;
78 return ret /= b;
79}
80
81//------------------------------N op 1------------------------
82template<typename T, std::size_t N>
83constexpr Array<T, N>& operator+=(Array<T, N>& a, const T& b)
84{
85 for (std::size_t i = 0; i < N; ++i)
86 a[i] += b;
87 return a;
88}
89
90template<typename T, std::size_t N>
91constexpr Array<T, N> operator+(const Array<T, N>& a, const T& b)
92{
93 Array<T, N> ret = a;
94 return ret += b;
95}
96
97template<typename T, std::size_t N>
98constexpr Array<T, N>& operator-=(Array<T, N>& a, const T& b)
99{
100 for (std::size_t i = 0; i < N; ++i)
101 a[i] -= b;
102 return a;
103}
104
105template<typename T, std::size_t N>
106constexpr Array<T, N> operator-(const Array<T, N>& a, const T& b)
107{
108 Array<T, N> ret = a;
109 return ret -= b;
110}
111
112template<typename T, std::size_t N>
113constexpr Array<T, N>& operator*=(Array<T, N>& a, const T& b)
114{
115 for (std::size_t i = 0; i < N; ++i)
116 a[i] *= b;
117 return a;
118}
119
120template<typename T, std::size_t N>
121constexpr Array<T, N> operator*(const Array<T, N>& a, const T& b)
122{
123 Array<T, N> ret = a;
124 return ret *= b;
125}
126
127template<typename T, std::size_t N>
128constexpr Array<T, N>& operator/=(Array<T, N>& a, const T& b)
129{
130 for (std::size_t i = 0; i < N; ++i)
131 a[i] /= b;
132 return a;
133}
134
135template<typename T, std::size_t N>
136constexpr Array<T, N> operator/(const Array<T, N>& a, const T& b)
137{
138 Array<T, N> ret = a;
139 return ret /= b;
140}
141
142//------------------------------取负号------------------------
143template<typename T, std::size_t N>
145{
146 Array<T, N> ret = a;
147 for (std::size_t i = 0; i < N; ++i)
148 ret[i] = -ret[i];
149 return ret;
150}
151
152template<typename T, std::size_t N>
154{
155 Array<T, N> ret = a;
156 for (std::size_t i = 0; i < N; ++i)
157 ret[i] = +ret[i];
158 return ret;
159}
160
161//------------------------------标准库容器扩展------------------------
162template<typename T, std::size_t N>
163std::vector<T>& operator+=(std::vector<T>& a, const std::array<T, N>& b)
164{
165 for (std::size_t i = 0; i < N; ++i)
166 a.push_back(b[i]);
167 return a;
168}
169
170}
constexpr ArrayS2< T, N > & operator/=(ArrayS2< T, N > &a, const Array< T, 2 > &b)
constexpr ArrayS2< T, N > & operator*=(ArrayS2< T, N > &a, const Array< T, 2 > &b)
constexpr ArrayS2< T, N > & operator+=(ArrayS2< T, N > &a, const Array< T, 2 > &b)
constexpr ArrayS2< T, N > operator+(const ArrayS2< T, N > &a, const Array< T, 2 > &b)
constexpr ArrayS2< T, N > operator-(const ArrayS2< T, N > &a, const Array< T, 2 > &b)
constexpr ArrayS2< T, N > operator/(const ArrayS2< T, N > &a, const Array< T, 2 > &b)
constexpr ArrayS2< T, N > & operator-=(ArrayS2< T, N > &a, const Array< T, 2 > &b)
constexpr ArrayS2< T, N > operator*(const ArrayS2< T, N > &a, const Array< T, 2 > &b)