23 #include <drizzled/field.h>
24 #include <drizzled/hybrid_type.h>
25 #include <drizzled/hybrid_type_traits_decimal.h>
26 #include <drizzled/item.h>
35 static const Hybrid_type_traits_decimal decimal_traits_instance;
38 Item_result Hybrid_type_traits_decimal::type()
const {
return DECIMAL_RESULT; }
42 Hybrid_type_traits_decimal::fix_length_and_dec(Item *item, Item *arg)
const
44 item->decimals= arg->decimals;
45 item->max_length= min(arg->max_length + DECIMAL_LONGLONG_DIGITS,
46 (
unsigned int)DECIMAL_MAX_STR_LENGTH);
50 void Hybrid_type_traits_decimal::set_zero(Hybrid_type *val)
const
52 val->dec_buf[0].set_zero();
53 val->used_dec_buf_no= 0;
57 void Hybrid_type_traits_decimal::add(Hybrid_type *val, Field *f)
const
59 class_decimal_add(E_DEC_FATAL_ERROR,
60 &val->dec_buf[val->used_dec_buf_no ^ 1],
61 &val->dec_buf[val->used_dec_buf_no],
62 f->val_decimal(&val->dec_buf[2]));
63 val->used_dec_buf_no^= 1;
71 void Hybrid_type_traits_decimal::div(
Hybrid_type *val, uint64_t u)
const
73 int2_class_decimal(E_DEC_FATAL_ERROR, u,
true, &val->dec_buf[2]);
75 class_decimal_div(E_DEC_FATAL_ERROR,
76 &val->dec_buf[val->used_dec_buf_no ^ 1],
77 &val->dec_buf[val->used_dec_buf_no],
79 val->used_dec_buf_no^= 1;
84 Hybrid_type_traits_decimal::val_int(
Hybrid_type *val,
bool unsigned_flag)
const
87 val->dec_buf[val->used_dec_buf_no].val_int32(E_DEC_FATAL_ERROR, unsigned_flag, &result);
94 Hybrid_type_traits_decimal::val_real(Hybrid_type *val)
const
96 class_decimal2double(E_DEC_FATAL_ERROR, &val->dec_buf[val->used_dec_buf_no],
102 type::Decimal *Hybrid_type_traits_decimal::val_decimal(Hybrid_type *val,
103 type::Decimal *)
const
104 {
return &val->dec_buf[val->used_dec_buf_no]; }
108 Hybrid_type_traits_decimal::val_str(Hybrid_type *val, String *to,
109 uint8_t decimals)
const
111 class_decimal_round(E_DEC_FATAL_ERROR, &val->dec_buf[val->used_dec_buf_no],
112 decimals,
false, &val->dec_buf[2]);
118 const Hybrid_type_traits_decimal *Hybrid_type_traits_decimal::instance()
120 return &decimal_traits_instance;
124 Hybrid_type_traits_decimal::Hybrid_type_traits_decimal()
TODO: Rename this file - func.h is stupid.
int class_decimal2string(const type::Decimal *d, uint32_t fixed_dec, String *str)
Converting decimal to string.