1// Boost.Geometry (aka GGL, Generic Geometry Library)
2// Unit Test
3
4// Copyright (c) 2014-2015 Oracle and/or its affiliates.
5
6// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
7// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
8
9// Licensed under the Boost Software License version 1.0.
10// http://www.boost.org/users/license.html
11
12#ifndef BOOST_GEOMETRY_TEST_UTIL_NUMBER_TYPES_HPP
13#define BOOST_GEOMETRY_TEST_UTIL_NUMBER_TYPES_HPP
14
15#include <cmath>
16
17
18// define a custom number type and its sqrt in own namespace
19namespace number_types
20{
21
22template <typename T>
23struct custom
24{
25 typedef custom<T> self;
26
27 T m_value;
28
29 custom() : m_value(0) {}
30 explicit custom(T const& value) : m_value(value) {}
31
32 bool operator<(self const& other) const
33 {
34 return m_value < other.m_value;
35 }
36
37 self operator-() const
38 {
39 return self(-m_value);
40 }
41
42 self operator-(self const& other) const
43 {
44 return self(m_value - other.m_value);
45 }
46};
47
48template <typename T>
49inline custom<T> sqrt(custom<T> const& c)
50{
51 return custom<T>(std::sqrt(c.m_value));
52}
53
54template <typename T>
55inline custom<T> fabs(custom<T> const& c)
56{
57 return custom<T>(c.m_value < T(0) ? c.m_value : -c.m_value);
58}
59
60} // namespace number_types
61
62
63
64
65
66
67// define a custom number type with sqrt in global namespace
68namespace number_types
69{
70
71template <typename T>
72struct custom_with_global_sqrt
73{
74 typedef custom_with_global_sqrt<T> self;
75
76 T m_value;
77
78 custom_with_global_sqrt() : m_value(0) {}
79 explicit custom_with_global_sqrt(T const& value) : m_value(value) {}
80
81 bool operator<(self const& other) const
82 {
83 return m_value < other.m_value;
84 }
85
86 self operator-() const
87 {
88 return self(-m_value);
89 }
90
91 self operator-(self const& other) const
92 {
93 return self(m_value - other.m_value);
94 }
95};
96
97} // namespace number_types
98
99template <typename T>
100inline number_types::custom_with_global_sqrt<T>
101sqrt(number_types::custom_with_global_sqrt<T> const& c)
102{
103 return number_types::custom_with_global_sqrt<T>(std::sqrt(c.m_value));
104}
105
106template <typename T>
107inline number_types::custom_with_global_sqrt<T>
108fabs(number_types::custom_with_global_sqrt<T> const& c)
109{
110 return number_types::custom_with_global_sqrt<T>
111 (c.m_value < T(0) ? c.m_value : -c.m_value);
112}
113
114
115
116
117
118
119// define a custom number type and its sqrt in global namespace
120template <typename T>
121struct custom_global
122{
123 typedef custom_global<T> self;
124
125 T m_value;
126
127 custom_global() : m_value(0) {}
128 explicit custom_global(T const& value) : m_value(value) {}
129
130 bool operator<(self const& other) const
131 {
132 return m_value < other.m_value;
133 }
134
135 self operator-() const
136 {
137 return self(-m_value);
138 }
139
140 self operator-(self const& other) const
141 {
142 return self(m_value - other.m_value);
143 }
144};
145
146template <typename T>
147inline custom_global<T> sqrt(custom_global<T> const& c)
148{
149 return custom_global<T>(std::sqrt(c.m_value));
150}
151
152template <typename T>
153inline custom_global<T> fabs(custom_global<T> const& c)
154{
155 return custom_global<T>(c.m_value < T(0) ? c.m_value : -c.m_value);
156}
157
158
159
160// custom number type without functions definition
161template <typename T>
162struct custom_raw
163{
164 typedef custom_raw<T> self;
165
166 T m_value;
167
168 custom_raw() : m_value(0) {}
169 explicit custom_raw(T const& value) : m_value(value) {}
170
171 bool operator<(self const& other) const
172 {
173 return m_value < other.m_value;
174 }
175
176 self operator-() const
177 {
178 return self(-m_value);
179 }
180
181 self operator-(self const& other) const
182 {
183 return self(m_value - other.m_value);
184 }
185};
186
187#endif // BOOST_GEOMETRY_TEST_UTIL_NUMBER_TYPES_HPP
188

source code of boost/libs/geometry/test/util/number_types.hpp