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 
25 #include "uniquePtr.hpp"
26 #include "triple.hpp"
27 #include "iOstream.hpp"
28 #include "iIstream.hpp"
29 #include "token.hpp"
30 #include "error.hpp"
31 
32 
33 namespace pFlow
34 {
35 
36 
37 template<typename T> class quadruple;
38 class iIstream;
39 
40 #include "quadrupleFwd.hpp"
41 
42 // you can see it as a sequence of four elements (w,x,y,z) or an (scalar and vector)
43 template<typename T>
44 class quadruple
45 {
46 public:
47 
48  T s_;
50 public:
51 
55  {}
56 
58 
60  quadruple(const T &w, const T &x, const T &y, const T &z)
61  :
62  s_(w),
63  v_(x, y, z)
64  {}
65 
67  quadruple(const T& s, const triple<T> v)
68  :
69  s_(s),
70  v_(v)
71  {}
72 
74  quadruple(const T &val)
75  :
76  s_(val),
77  v_(val)
78  {}
79 
80  // type conversion trough assignment
81  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  quadruple(const quadruple<T2> &src):
94  s_(static_cast<T>(src.s_)),
95  v_(src.v_)
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(){ return s_; }
131  const T & w()const { return s_; }
132 
134  T & x(){ return v_.x(); }
136  const T & x()const { return v_.x(); }
137 
139  T & y(){ return v_.y(); }
141  const T & y()const { return v_.y(); }
142 
144  T & z(){ return v_.z(); }
146  const T & z()const { return v_.z(); }
147 
149  T & s(){ return s_; }
151  const T & s()const { return s_; }
152 
154  triple<T> v() {return v_;}
156  const triple<T> v() const {return v_;}
157 
158 
159  // methods
160  friend FUNCTION_HD T dot <T> (const quadruple<T> & oprnd1, const quadruple<T> & oprnd2);
161 
162  INLINE_FUNCTION_HD T length() const;
163 
165 
166 
168 
169  // + operator
170  friend FUNCTION_HD quadruple<T> operator+ <T> (const quadruple<T> & oprnd1, const quadruple<T> & oprnd2);
171 
172  friend FUNCTION_HD quadruple<T> operator+ <T> (const quadruple<T> & oprnd1, const T & oprnd2);
173 
174  friend FUNCTION_HD quadruple<T> operator+ <T> (const T & oprnd1, const quadruple<T> & oprnd2);
175 
176  // - operator
177  friend FUNCTION_HD quadruple<T> operator - <T> (const quadruple<T> & oprnd1, const quadruple<T> & oprnd2);
178 
179  friend FUNCTION_HD quadruple<T> operator - <T> (const quadruple<T> & oprnd1, const T & oprnd2);
180 
181  friend FUNCTION_HD quadruple<T> operator - <T> (const T & oprnd1, const quadruple<T> & oprnd2);
182 
183  // * operators
184  friend FUNCTION_HD quadruple<T> operator * <T> (const quadruple<T> & oprnd1, const quadruple<T> & oprnd2);
185 
186  friend FUNCTION_HD quadruple<T> operator * <T> (const quadruple<T> & oprnd1, const T & oprnd2);
187 
188  friend FUNCTION_HD quadruple<T> operator * <T> (const T & oprnd1, const quadruple<T> & oprnd2);
189 
190  // / operators
191  friend FUNCTION_HD quadruple<T> operator / <T> (const quadruple<T> & oprnd1, const quadruple<T> & oprnd2);
192 
193  friend FUNCTION_HD quadruple<T> operator / <T> (const quadruple<T> & oprnd1, const T & oprnd2);
194 
195  friend FUNCTION_HD quadruple<T> operator / <T> (const T & oprnd1, const quadruple<T> & oprnd2);
196 
197 
199  void operator+= (const quadruple & oprnd2);
200 
202  void operator-= (const quadruple & oprnd2);
203 
205  void operator*= (const quadruple & oprnd2);
206 
208  void operator/= (const quadruple & oprnd2);
209 
210 
211  // unary negate operator
213  quadruple operator- ()const;
214 
215  // unary plus operator
217  quadruple operator+ ()const;
218 
219 
220  friend FUNCTION_HD bool operator == <T> (const quadruple<T> &opr1, const quadruple<T> &opr2);
221 
222  // << operator
223  friend FUNCTION_H iOstream& operator<< <T> (iOstream& str, const quadruple<T> & ov);
224 
225  // >> operator
226  friend FUNCTION_H iIstream& operator >> <T> (iIstream & str, quadruple<T> & iv);
227 
228  // same as >> operator, but faster, good for mass read
229  friend FUNCTION_H void readIstream <T>( iIstream& str, quadruple<T> &iv);
230 
231 
232 };
233 
234 } // pFlow
235 
236 
237 #include "quadrupleI.hpp"
238 //#include "quadrupleMath.hpp"
239 
240 #endif
pFlow::quadruple::operator-
INLINE_FUNCTION_HD quadruple operator-() const
Definition: quadrupleI.hpp:259
quadrupleFwd.hpp
pFlow::quadruple::w
const INLINE_FUNCTION_HD T & w() const
Definition: quadruple.hpp:131
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:139
iIstream.hpp
pFlow::quadruple::length
INLINE_FUNCTION_HD T length() const
Definition: quadrupleI.hpp:34
pFlow::quadruple::v_
triple< T > v_
Definition: quadruple.hpp:49
pFlow::quadruple::normalize
INLINE_FUNCTION_HD void normalize()
Definition: quadrupleI.hpp:42
pFlow::quadruple::y
const INLINE_FUNCTION_HD T & y() const
Definition: quadruple.hpp:141
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:136
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:93
pFlow::quadruple::v
INLINE_FUNCTION_HD triple< T > v()
Definition: quadruple.hpp:154
pFlow::quadruple::s
INLINE_FUNCTION_HD T & s()
Definition: quadruple.hpp:149
pFlow::quadruple::operator*=
INLINE_FUNCTION_HD void operator*=(const quadruple &oprnd2)
Definition: quadrupleI.hpp:238
pFlow::quadruple::s_
T s_
Definition: quadruple.hpp:48
pFlow::quadruple::operator+=
INLINE_FUNCTION_HD void operator+=(const quadruple &oprnd2)
Definition: quadrupleI.hpp:217
pFlow
Definition: demComponent.hpp:28
pFlow::quadruple::quadruple
INLINE_FUNCTION_HD quadruple(const T &val)
Definition: quadruple.hpp:74
FUNCTION_H
#define FUNCTION_H
Definition: pFlowMacros.hpp:58
pFlow::quadruple::operator+
INLINE_FUNCTION_HD quadruple operator+() const
Definition: quadrupleI.hpp:267
uniquePtr.hpp
pFlow::quadruple::clone
INLINE_FUNCTION_H uniquePtr< quadruple< T > > clone() const
Definition: quadruple.hpp:116
pFlow::iIstream
Definition: iIstream.hpp:33
pFlow::quadruple::operator-=
INLINE_FUNCTION_HD void operator-=(const quadruple &oprnd2)
Definition: quadrupleI.hpp:227
quadrupleI.hpp
INLINE_FUNCTION_H
#define INLINE_FUNCTION_H
Definition: pFlowMacros.hpp:53
pFlow::quadruple::s
const INLINE_FUNCTION_HD T & s() const
Definition: quadruple.hpp:151
pFlow::quadruple::quadruple
INLINE_FUNCTION_HD quadruple()
Definition: quadruple.hpp:54
FUNCTION_HD
#define FUNCTION_HD
Definition: pFlowMacros.hpp:57
pFlow::quadruple::z
INLINE_FUNCTION_HD T & z()
Definition: quadruple.hpp:144
triple.hpp
pFlow::quadruple::operator/=
INLINE_FUNCTION_HD void operator/=(const quadruple &oprnd2)
Definition: quadrupleI.hpp:248
pFlow::uniquePtr
Definition: uniquePtr.hpp:44
pFlow::quadruple::z
const INLINE_FUNCTION_HD T & z() const
Definition: quadruple.hpp:146
pFlow::quadruple::quadruple
INLINE_FUNCTION_HD quadruple(const T &s, const triple< T > v)
Definition: quadruple.hpp:67
pFlow::quadruple
Definition: quadruple.hpp:37
pFlow::quadruple::quadruple
INLINE_FUNCTION_HD quadruple(const T &w, const T &x, const T &y, const T &z)
Definition: quadruple.hpp:60
iOstream.hpp
pFlow::quadruple::x
INLINE_FUNCTION_HD T & x()
Definition: quadruple.hpp:134
INLINE_FUNCTION_HD
#define INLINE_FUNCTION_HD
Definition: pFlowMacros.hpp:51
pFlow::triple
Definition: triple.hpp:37
pFlow::quadruple::v
const INLINE_FUNCTION_HD triple< T > v() const
Definition: quadruple.hpp:156
pFlow::iOstream
Definition: iOstream.hpp:53
error.hpp