A Discrete-Event Network Simulator
API
vector.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2007 INRIA
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
19  */
20 #include "vector.h"
21 #include "fatal-error.h"
22 #include "log.h"
23 #include <cmath>
24 #include <sstream>
25 #include <tuple>
26 
33 namespace ns3 {
34 
35 NS_LOG_COMPONENT_DEFINE ("Vector");
36 
39 
40 // compatibility for mobility code
42 {
44  return MakeVector3DChecker ();
45 }
46 
47 
48 Vector3D::Vector3D (double _x, double _y, double _z)
49  : x (_x),
50  y (_y),
51  z (_z)
52 {
53  NS_LOG_FUNCTION (this << _x << _y << _z);
54 }
55 
57  : x (0.0),
58  y (0.0),
59  z (0.0)
60 {
61  NS_LOG_FUNCTION (this);
62 }
63 
64 Vector2D::Vector2D (double _x, double _y)
65  : x (_x),
66  y (_y)
67 {
68  NS_LOG_FUNCTION (this << _x << _y);
69 }
70 
72  : x (0.0),
73  y (0.0)
74 {
75  NS_LOG_FUNCTION (this);
76 }
77 
78 double
80 {
81  NS_LOG_FUNCTION (this);
82  return std::sqrt (x * x + y * y + z * z);
83 }
84 double
86 {
87  NS_LOG_FUNCTION (this);
88  return std::sqrt (x * x + y * y);
89 }
90 
91 double
92 CalculateDistance (const Vector3D &a, const Vector3D &b)
93 {
94  NS_LOG_FUNCTION (a << b);
95  return (b - a).GetLength ();
96 }
97 double
98 CalculateDistance (const Vector2D &a, const Vector2D &b)
99 {
100  NS_LOG_FUNCTION (a << b);
101  return (b - a).GetLength ();
102 }
103 
104 std::ostream &operator << (std::ostream &os, const Vector3D &vector)
105 {
106  os << vector.x << ":" << vector.y << ":" << vector.z;
107  return os;
108 }
109 std::istream &operator >> (std::istream &is, Vector3D &vector)
110 {
111  char c1, c2;
112  is >> vector.x >> c1 >> vector.y >> c2 >> vector.z;
113  if (c1 != ':'
114  || c2 != ':')
115  {
116  is.setstate (std::ios_base::failbit);
117  }
118  return is;
119 }
120 bool operator < (const Vector3D &a, const Vector3D &b)
121 {
122  return std::tie (a.x, a.y, a.z) <
123  std::tie (b.x, b.y, b.z);
124 }
125 bool operator <= (const Vector3D &a, const Vector3D &b)
126 {
127  return std::tie (a.x, a.y, a.z) <=
128  std::tie (b.x, b.y, b.z);
129 }
130 bool operator > (const Vector3D &a, const Vector3D &b)
131 {
132  return std::tie (a.x, a.y, a.z) >
133  std::tie (b.x, b.y, b.z);
134 }
135 bool operator >= (const Vector3D &a, const Vector3D &b)
136 {
137  return std::tie (a.x, a.y, a.z) >=
138  std::tie (b.x, b.y, b.z);
139 }
140 bool operator == (const Vector3D &a, const Vector3D &b)
141 {
142  return std::tie (a.x, a.y, a.z) ==
143  std::tie (b.x, b.y, b.z);
144 }
145 bool operator != (const Vector3D &a, const Vector3D &b)
146 {
147  return !(a == b);
148 }
149 Vector3D
150 operator + (const Vector3D &a, const Vector3D &b)
151 {
152  return Vector3D (a.x + b.x, a.y + b.y, a.z + b.z);
153 }
154 Vector3D
155 operator - (const Vector3D &a, const Vector3D &b)
156 {
157  return Vector3D (a.x - b.x, a.y - b.y, a.z - b.z);
158 }
159 std::ostream &operator << (std::ostream &os, const Vector2D &vector)
160 {
161  os << vector.x << ":" << vector.y;
162  return os;
163 }
164 std::istream &operator >> (std::istream &is, Vector2D &vector)
165 {
166  char c1;
167  is >> vector.x >> c1 >> vector.y;
168  if (c1 != ':')
169  {
170  is.setstate (std::ios_base::failbit);
171  }
172  return is;
173 }
174 bool operator < (const Vector2D &a, const Vector2D &b)
175 {
176  return std::tie (a.x, a.y) <
177  std::tie (b.x, b.y);
178 }
179 bool operator <= (const Vector2D &a, const Vector2D &b)
180 {
181  return std::tie (a.x, a.y) <=
182  std::tie (b.x, b.y);
183 }
184 bool operator > (const Vector2D &a, const Vector2D &b)
185 {
186  return std::tie (a.x, a.y) >
187  std::tie (b.x, b.y);
188 }
189 bool operator >= (const Vector2D &a, const Vector2D &b)
190 {
191  return std::tie (a.x, a.y) >=
192  std::tie (b.x, b.y);
193 }
194 bool operator == (const Vector2D &a, const Vector2D &b)
195 {
196  return std::tie (a.x, a.y) ==
197  std::tie (b.x, b.y);
198 }
199 bool operator != (const Vector2D &a, const Vector2D &b)
200 {
201  return !(a == b);
202 }
203 Vector2D
204 operator + (const Vector2D &a, const Vector2D &b)
205 {
206  return Vector2D (a.x + b.x, a.y + b.y);
207 }
208 Vector2D
209 operator - (const Vector2D &a, const Vector2D &b)
210 {
211  return Vector2D (a.x - b.x, a.y - b.y);
212 }
213 
214 } // namespace ns3
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:74
a 2d vector
Definition: vector.h:169
double y
y coordinate of vector
Definition: vector.h:181
Vector2D()
Constructor: (0.0, 0.0)
Definition: vector.cc:71
double x
x coordinate of vector
Definition: vector.h:180
double GetLength() const
Compute the length (magnitude) of the vector.
Definition: vector.cc:85
a 3d vector
Definition: vector.h:46
double GetLength() const
Compute the length (magnitude) of the vector.
Definition: vector.cc:79
double x
x coordinate of vector
Definition: vector.h:59
Vector3D()
Create vector (0.0, 0.0, 0.0)
Definition: vector.cc:56
double z
z coordinate of vector
Definition: vector.h:61
double y
y coordinate of vector
Definition: vector.h:60
NS_FATAL_x macro definitions.
Ptr< const AttributeChecker > MakeVector3DChecker(void)
Definition: vector.cc:37
Ptr< const AttributeChecker > MakeVectorChecker(void)
Definition: vector.cc:41
#define ATTRIBUTE_HELPER_CPP(type)
Define the attribute value, accessor and checkers for class type
bool operator>(const int64x64_t &lhs, const int64x64_t &rhs)
Greater operator.
Definition: int64x64-128.h:431
int64x64_t operator+(const int64x64_t &lhs)
Unary plus operator.
Definition: int64x64-128.h:491
int64x64_t operator-(const int64x64_t &lhs)
Unary negation operator (change sign operator).
Definition: int64x64-128.h:501
bool operator>=(const int64x64_t &lhs, const int64x64_t &rhs)
Greater or equal operator.
Definition: int64x64.h:166
bool operator<=(const int64x64_t &lhs, const int64x64_t &rhs)
Less or equal operator.
Definition: int64x64.h:155
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
#define NS_LOG_FUNCTION_NOARGS()
Output the name of the function.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
Debug message logging.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
bool operator==(const EventId &a, const EventId &b)
Definition: event-id.h:142
bool operator<(const EventId &a, const EventId &b)
Definition: event-id.h:160
double CalculateDistance(const Vector3D &a, const Vector3D &b)
Definition: vector.cc:92
bool operator!=(Callback< R, T1, T2, T3, T4, T5, T6, T7, T8, T9 > a, Callback< R, T1, T2, T3, T4, T5, T6, T7, T8, T9 > b)
Inequality test.
Definition: callback.h:1606
std::istream & operator>>(std::istream &is, Angles &a)
Definition: angles.cc:160
std::ostream & operator<<(std::ostream &os, const Angles &a)
Definition: angles.cc:137
ns3::Vector, ns3::Vector2D and ns3::Vector3D declarations.