www.cemf.ir
quadruple.hpp
Go to the documentation of this file.
1 /*------------------------------- phasicFlow ---------------------------------
2  O C enter of
3  O O E ngineering and
4  O O M ultiscale modeling of
5  OOOOOOO F luid flow
6 ------------------------------------------------------------------------------
7  Copyright (C): www.cemf.ir
8  email: hamid.r.norouzi AT gmail.com
9 ------------------------------------------------------------------------------
10 Licence:
11  This file is part of phasicFlow code. It is a free software for simulating
12  granular and multiphase flows. You can redistribute it and/or modify it under
13  the terms of GNU General Public License v3 or any other later versions.
14 
15  phasicFlow is distributed to help others in their research in the field of
16  granular and multiphase flows, but WITHOUT ANY WARRANTY; without even the
17  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 
19 -----------------------------------------------------------------------------*/
20 
21 #ifndef __quadruple_hpp__
22 #define __quadruple_hpp__
23 
24 #include "error.hpp"
25 #include "typeInfo.hpp"
26 #include "iIstream.hpp"
27 #include "iOstream.hpp"
28 #include "token.hpp"
29 #include "triple.hpp"
30 #include "uniquePtr.hpp"
31 
32 namespace pFlow
33 {
34 
35 template<typename T>
36 class quadruple;
37 class iIstream;
38 
39 #include "quadrupleFwd.hpp"
40 
41 // you can see it as a sequence of four elements (w,x,y,z) or an (scalar and
42 // vector)
43 template<typename T>
44 struct quadruple
45 {
46  T s_;
48 
49 
51 
55  {
56  }
57 
59 
61  quadruple(const T& w, const T& x, const T& y, const T& z)
62  : s_(w),
63  v_(x, y, z)
64  {
65  }
66 
68  quadruple(const T& s, const triple<T> v)
69  : s_(s),
70  v_(v)
71  {
72  }
73 
75  quadruple(const T& val)
76  : s_(val),
77  v_(val)
78  {
79  }
80 
81  // type conversion trough assignment
82  template<typename T2>
84  {
85  this->v_ = rhs.v_;
86  this->s_ = static_cast<T>(rhs.s_);
87  return *this;
88  }
89 
90  // type casting through copy constructor
91  template<typename T2>
93  : s_(static_cast<T>(src.s_)),
94  v_(src.v_)
95  {
96  }
97 
98  // copy construct
100  quadruple(const quadruple<T>& src) = default;
101 
102  // move construct
104  quadruple(quadruple<T>&& src) = default;
105 
106  // copy assignment
108  quadruple<T>& operator=(const quadruple<T>& src) = default;
109 
110  // move assignment
112  quadruple<T>& operator=(quadruple<T>&& src) = default;
113 
114  // clone
117  {
118  return makeUnique<quadruple<T>>(*this);
119  }
120 
123  {
124  return new quadruple<T>(*this);
125  }
126 
127  // Access
129  T& w()
130  {
131  return s_;
132  }
134  const T& w() const
135  {
136  return s_;
137  }
138 
140  T& x()
141  {
142  return v_.x();
143  }
145  const T& x() const
146  {
147  return v_.x();
148  }
149 
151  T& y()
152  {
153  return v_.y();
154  }
156  const T& y() const
157  {
158  return v_.y();
159  }
160 
162  T& z()
163  {
164  return v_.z();
165  }
167  const T& z() const
168  {
169  return v_.z();
170  }
171 
173  T& s()
174  {
175  return s_;
176  }
178  const T& s() const
179  {
180  return s_;
181  }
182 
185  {
186  return v_;
187  }
189  const triple<T> v() const
190  {
191  return v_;
192  }
193 
194  // methods
195  friend FUNCTION_HD T
196  dot<T>(const quadruple<T>& oprnd1, const quadruple<T>& oprnd2);
197 
198  INLINE_FUNCTION_HD T length() const;
199 
201 
203 
204  // + operator
205  friend FUNCTION_HD quadruple<T> operator+
206  <T>(const quadruple<T>& oprnd1, const quadruple<T>& oprnd2);
207 
208  friend FUNCTION_HD quadruple<T> operator+
209  <T>(const quadruple<T>& oprnd1, const T& oprnd2);
210 
211  friend FUNCTION_HD quadruple<T> operator+
212  <T>(const T& oprnd1, const quadruple<T>& oprnd2);
213 
214  // - operator
215  friend FUNCTION_HD quadruple<T> operator-
216  <T>(const quadruple<T>& oprnd1, const quadruple<T>& oprnd2);
217 
218  friend FUNCTION_HD quadruple<T> operator-
219  <T>(const quadruple<T>& oprnd1, const T& oprnd2);
220 
221  friend FUNCTION_HD quadruple<T> operator-
222  <T>(const T& oprnd1, const quadruple<T>& oprnd2);
223 
224  // * operators
225  friend FUNCTION_HD quadruple<T> operator*
226  <T>(const quadruple<T>& oprnd1, const quadruple<T>& oprnd2);
227 
228  friend FUNCTION_HD quadruple<T> operator*
229  <T>(const quadruple<T>& oprnd1, const T& oprnd2);
230 
231  friend FUNCTION_HD quadruple<T> operator*
232  <T>(const T& oprnd1, const quadruple<T>& oprnd2);
233 
234  // / operators
235  friend FUNCTION_HD quadruple<T> operator/
236  <T>(const quadruple<T>& oprnd1, const quadruple<T>& oprnd2);
237 
238  friend FUNCTION_HD quadruple<T> operator/
239  <T>(const quadruple<T>& oprnd1, const T& oprnd2);
240 
241  friend FUNCTION_HD quadruple<T> operator/
242  <T>(const T& oprnd1, const quadruple<T>& oprnd2);
243 
245  void operator+=(const quadruple& oprnd2);
246 
248  void operator-=(const quadruple& oprnd2);
249 
251  void operator*=(const quadruple& oprnd2);
252 
254  void operator/=(const quadruple& oprnd2);
255 
256  // unary negate operator
258  quadruple operator-() const;
259 
260  // unary plus operator
262  quadruple operator+() const;
263 
264  friend FUNCTION_HD bool operator==
265  <T>(const quadruple<T>& opr1, const quadruple<T>& opr2);
266 
267  // << operator
268  friend FUNCTION_H iOstream&
269  operator<< <T>(iOstream& str, const quadruple<T>& ov);
270 
271  // >> operator
272  friend FUNCTION_H iIstream& operator>> <T>(iIstream& str, quadruple<T>& iv);
273 
274  // same as >> operator, but faster, good for mass read
275  friend FUNCTION_H void readIstream<T>(iIstream& str, quadruple<T>& iv);
276 };
277 
278 } // pFlow
279 
280 #include "quadrupleI.hpp"
281 // #include "quadrupleMath.hpp"
282 
283 #endif
pFlow::quadruple::operator-
INLINE_FUNCTION_HD quadruple operator-() const
Definition: quadrupleI.hpp:164
quadrupleFwd.hpp
pFlow::quadruple::w
const INLINE_FUNCTION_HD T & w() const
Definition: quadruple.hpp:134
pFlow::quadruple::clonePtr
INLINE_FUNCTION_H quadruple< T > * clonePtr() const
Definition: quadruple.hpp:122
pFlow::quadruple::y
INLINE_FUNCTION_HD T & y()
Definition: quadruple.hpp:151
iIstream.hpp
pFlow::quadruple::length
INLINE_FUNCTION_HD T length() const
Definition: quadrupleI.hpp:30
pFlow::quadruple::v_
triple< T > v_
Definition: quadruple.hpp:47
pFlow::quadruple::normalize
INLINE_FUNCTION_HD void normalize()
Definition: quadrupleI.hpp:37
pFlow::quadruple::y
const INLINE_FUNCTION_HD T & y() const
Definition: quadruple.hpp:156
pFlow::quadruple::w
INLINE_FUNCTION_HD T & w()
Definition: quadruple.hpp:129
pFlow::quadruple::x
const INLINE_FUNCTION_HD T & x() const
Definition: quadruple.hpp:145
token.hpp
pFlow::quadruple::operator=
INLINE_FUNCTION_HD quadruple< T > & operator=(const quadruple< T2 > &rhs)
Definition: quadruple.hpp:83
pFlow::quadruple::quadruple
INLINE_FUNCTION_HD quadruple(const quadruple< T2 > &src)
Definition: quadruple.hpp:92
pFlow::quadruple::v
INLINE_FUNCTION_HD triple< T > v()
Definition: quadruple.hpp:184
pFlow::quadruple::s
INLINE_FUNCTION_HD T & s()
Definition: quadruple.hpp:173
pFlow::quadruple::operator*=
INLINE_FUNCTION_HD void operator*=(const quadruple &oprnd2)
Definition: quadrupleI.hpp:148
pFlow::quadruple::s_
T s_
Definition: quadruple.hpp:46
pFlow::quadruple::operator+=
INLINE_FUNCTION_HD void operator+=(const quadruple &oprnd2)
Definition: quadrupleI.hpp:132
pFlow
Definition: demGeometry.hpp:27
pFlow::quadruple::quadruple
INLINE_FUNCTION_HD quadruple(const T &val)
Definition: quadruple.hpp:75
FUNCTION_H
#define FUNCTION_H
Definition: pFlowMacros.hpp:62
pFlow::quadruple::operator+
INLINE_FUNCTION_HD quadruple operator+() const
Definition: quadrupleI.hpp:171
uniquePtr.hpp
pFlow::quadruple::clone
INLINE_FUNCTION_H uniquePtr< quadruple< T > > clone() const
Definition: quadruple.hpp:116
pFlow::iIstream
Interface class for any input stream
Definition: iIstream.hpp:37
pFlow::quadruple::operator-=
INLINE_FUNCTION_HD void operator-=(const quadruple &oprnd2)
Definition: quadrupleI.hpp:140
quadrupleI.hpp
INLINE_FUNCTION_H
#define INLINE_FUNCTION_H
Definition: pFlowMacros.hpp:57
pFlow::quadruple::s
const INLINE_FUNCTION_HD T & s() const
Definition: quadruple.hpp:178
pFlow::quadruple::QuadrupleTypeInfoNV
QuadrupleTypeInfoNV(T)
pFlow::quadruple::quadruple
INLINE_FUNCTION_HD quadruple()
Definition: quadruple.hpp:54
FUNCTION_HD
#define FUNCTION_HD
Definition: pFlowMacros.hpp:61
pFlow::quadruple::z
INLINE_FUNCTION_HD T & z()
Definition: quadruple.hpp:162
triple.hpp
pFlow::quadruple::operator/=
INLINE_FUNCTION_HD void operator/=(const quadruple &oprnd2)
Definition: quadrupleI.hpp:156
pFlow::uniquePtr
Definition: uniquePtr.hpp:42
pFlow::quadruple::z
const INLINE_FUNCTION_HD T & z() const
Definition: quadruple.hpp:167
pFlow::quadruple::quadruple
INLINE_FUNCTION_HD quadruple(const T &s, const triple< T > v)
Definition: quadruple.hpp:68
typeInfo.hpp
pFlow::quadruple
Definition: quadruple.hpp:36
pFlow::quadruple::quadruple
INLINE_FUNCTION_HD quadruple(const T &w, const T &x, const T &y, const T &z)
Definition: quadruple.hpp:61
iOstream.hpp
pFlow::quadruple::x
INLINE_FUNCTION_HD T & x()
Definition: quadruple.hpp:140
INLINE_FUNCTION_HD
#define INLINE_FUNCTION_HD
Definition: pFlowMacros.hpp:55
pFlow::triple
A set of 3 variables that can be used for vector variables.
Definition: triple.hpp:36
pFlow::quadruple::v
const INLINE_FUNCTION_HD triple< T > v() const
Definition: quadruple.hpp:189
pFlow::iOstream
Interface class for any output stream.
Definition: iOstream.hpp:59
error.hpp