14 class CLASS_DECL_ACME number
35 enum_number m_enumber;
37 number(enum_number enumber = e_number_none) { m_hi = 0; m_enumber = enumber; }
38 number(::i8 i) { m_i8 = i; m_enumber = e_number_char; }
39 number(::u8 u) { m_u8 = u; m_enumber = e_number_unsigned_char; }
40 number(::i16 i) { m_i16 = i; m_enumber = e_number_short; }
41 number(::u16 u) { m_u16 = u; m_enumber = e_number_unsigned_short; }
42 number(::i32 i) { m_i32 = i; m_enumber = e_number_int; }
43 number(::u32 u) { m_u32 = u; m_enumber = e_number_u32; }
44 number(::i64 i) { m_hi = i; m_enumber = e_number_i64; }
45 number(::u64 u) { m_hn = u; m_enumber = e_number_u64; }
46 number(::f32 f) { m_f32 = f; m_enumber = e_number_f32; }
47 number(::f64 d) { m_f64 = d; m_enumber = e_number_f64; }
53 bool ok()
const {
return m_enumber != e_number_none; }
54 bool nok()
const {
return !ok(); }
55 bool is_f32()
const {
return m_enumber & 16; }
56 bool is_integer()
const {
return m_enumber & 6; }
57 bool is_signed()
const {
return m_enumber & 2; }
58 bool is_unsigned()
const {
return m_enumber & 4; }
60 template <
typename T >
69 case e_number_unsigned_char:
73 case e_number_unsigned_short:
92 template <
typename T >
102 case e_number_unsigned_char:
108 case e_number_unsigned_short:
133 ::i8 get_char()
const {
return get < ::i8>(); }
134 ::u8 get_unsigned_char()
const {
return get < ::u8>(); }
135 ::i16 get_short()
const {
return get < ::i16>(); }
136 ::u16 get_unsigned_short()
const {
return get < ::u16>(); }
137 ::i32 get_int()
const {
return get < ::i32>(); }
138 ::u32 get_u32()
const {
return get < ::u32>(); }
139 ::i64 get_i64()
const {
return get < ::i64>(); }
140 ::u64 get_u64()
const {
return get < ::u64>(); }
141 ::f32 get_f32()
const {
return get < ::f32>(); }
142 ::f64 get_f64()
const {
return get < ::f64>(); }
150 numberResult.m_enumber = maximum(m_enumber, number.m_enumber);
152 if (numberResult.is_f32())
155 numberResult.set(get_f64() + number.get_f64());
158 else if (numberResult.is_integer())
161 numberResult.set(get_i64() + number.get_i64());
175 numberResult.m_enumber = maximum(m_enumber, number.m_enumber);
177 if (numberResult.is_f32())
180 numberResult.set(get_f64() - number.get_f64());
183 else if (numberResult.is_integer())
186 numberResult.set(get_i64() - number.get_i64());
199 numberResult.m_enumber = maximum(m_enumber, number.m_enumber);
201 if (numberResult.is_f32())
204 numberResult.set(get_f64() * number.get_f64());
207 else if (numberResult.is_integer())
210 numberResult.set(get_i64() * number.get_i64());
224 numberResult.m_enumber = maximum(m_enumber, number.m_enumber);
226 if (numberResult.is_f32())
229 numberResult.set(get_f64() / number.get_f64());
232 else if (numberResult.is_integer())
235 numberResult.set(get_i64() / number.get_i64());
244 bool operator == (
const number& number)
const
247 auto enumber = maximum(m_enumber, number.m_enumber);
252 return get_f64() == number.get_f64();
255 else if (enumber & 6)
258 return get_i64() == number.get_i64();
266 bool operator != (
const number& number)
const
269 auto enumber = maximum(m_enumber, number.m_enumber);
274 return get_f64() != number.get_f64();
277 else if (enumber & 6)
280 return get_i64() != number.get_i64();
289 bool operator < (
const number& number)
const
292 auto enumber = maximum(m_enumber, number.m_enumber);
297 return get_f64() < number.get_f64();
300 else if (enumber & 6)
303 return get_i64() < number.get_i64();
312 bool operator <= (
const number& number)
const
315 auto enumber = maximum(m_enumber, number.m_enumber);
320 return get_f64() <= number.get_f64();
323 else if (enumber & 6)
326 return get_i64() <= number.get_i64();
335 bool operator > (
const number& number)
const
338 auto enumber = maximum(m_enumber, number.m_enumber);
343 return get_f64() > number.get_f64();
346 else if (enumber & 6)
349 return get_i64() > number.get_i64();
359 bool operator >= (
const number& number)
const
362 auto enumber = maximum(m_enumber, number.m_enumber);
367 return get_f64() >= number.get_f64();
370 else if (enumber & 6)
373 return get_i64() >= number.get_i64();
433 class CLASS_DECL_ACME scalar_source :
434 virtual public particle
440 virtual public particle
445 virtual bool on_set_scalar(scalar_source * pscalar, enum_scalar escalar,
::number::number n, ::i32 iFlags);
453 ::pointer_array < listener > m_scalarlistenera;
454 ::atom m_atomScalarSource;
460 bool set_scalar(enum_scalar escalar,
::number::number real,
bool bForce =
false,::i32 iFlags = e_scalar_none);
463 ::f64 get_scalar_rate(enum_scalar escalar,::f64 dDefault = 0.0);
464 bool set_scalar_rate(enum_scalar escalar,::f64 dValue,::i32 iFlags);
481 virtual bool on_set_scalar(enum_scalar escalar,
::number::number integer, ::i32 iFlags);
482 virtual ::number::number get_scalar_minimum(enum_scalar escalar);
483 virtual ::number::number get_scalar(enum_scalar escalar);
484 virtual ::number::number get_scalar_maximum(enum_scalar escalar);
494 class CLASS_DECL_ACME scalar :
495 virtual public ::particle
501 ::pointer < scalar_source > m_psource;
503 enum_scalar m_escalar;
506 scalar(
scalar_source* psource =
nullptr, enum_scalar ereal_scalar = e_scalar_none);
508 virtual ::f64 get_rate(::f64 dDefault = 0.0);
510 virtual bool set_rate(::f64 dRate, ::i32 iFlags);
515 bool is_null()
const {
return m_psource ==
nullptr || m_escalar == e_scalar_none; }
516 bool is_set()
const {
return !is_null(); }
523 scalar & operator = (const ::number::scalar & scalar) { set(scalar.get());
return *
this; }
530 void increment(number number = 1) { set(get() + number); }
531 void decrement(number number = 1) { set(get() - number); }
533 scalar& operator ++(::i32) { increment();
return *
this; }
534 scalar& operator --(::i32) { decrement();
return *
this; }