Merge pull request #1496 from echampet/serializers
[mono.git] / mono / metadata / decimal-ms.h
1 #ifndef __MONO_DECIMAL_MS_H__
2 #define __MONO_DECIMAL_MS_H__
3 typedef struct tagDECIMAL {
4     // Decimal.cs treats the first two shorts as one long
5     // And they seriable the data so we need to little endian
6     // seriliazation
7     // The wReserved overlaps with Variant's vt member
8 #if G_BYTE_ORDER != G_LITTLE_ENDIAN
9     union {
10         struct {
11             uint8_t sign;
12             uint8_t scale;
13         } u;
14         uint16_t signscale;
15     } u;
16     uint16_t reserved;
17 #else
18     uint16_t reserved;
19     union {
20         struct {
21             uint8_t scale;
22             uint8_t sign;
23         } u;
24         uint16_t signscale;
25     } u;
26 #endif
27     uint32_t Hi32;
28     union {
29         struct {
30             uint32_t Lo32;
31             uint32_t Mid32;
32         } v;
33         uint64_t Lo64;
34     } v;
35 } MonoDecimal;
36
37 typedef enum {
38         MONO_DECIMAL_CMP_LT=-1,
39         MONO_DECIMAL_CMP_EQ,
40         MONO_DECIMAL_CMP_GT
41 } MonoDecimalCompareResult;
42         
43 MonoDecimalCompareResult
44         mono_decimal_compare (MonoDecimal *left, MonoDecimal *right) MONO_INTERNAL;
45
46 void    mono_decimal_init_single   (MonoDecimal *_this, float value) MONO_INTERNAL;
47 void    mono_decimal_init_double   (MonoDecimal *_this, double value) MONO_INTERNAL;
48 void    mono_decimal_floor         (MonoDecimal *d) MONO_INTERNAL;
49 int32_t mono_decimal_get_hash_code (MonoDecimal *d) MONO_INTERNAL;
50 void    mono_decimal_multiply      (MonoDecimal *d1, MonoDecimal *d2) MONO_INTERNAL;
51 void    mono_decimal_round         (MonoDecimal *d, int32_t decimals) MONO_INTERNAL;
52 void    mono_decimal_tocurrency    (MonoDecimal *decimal) MONO_INTERNAL;
53 double  mono_decimal_to_double     (MonoDecimal d) MONO_INTERNAL;
54 int32_t mono_decimal_to_int32      (MonoDecimal d) MONO_INTERNAL;
55 float   mono_decimal_to_float      (MonoDecimal d) MONO_INTERNAL;
56 void    mono_decimal_truncate      (MonoDecimal *d) MONO_INTERNAL;
57 void    mono_decimal_addsub        (MonoDecimal *left, MonoDecimal *right, uint8_t sign);
58 void    mono_decimal_divide        (MonoDecimal *left, MonoDecimal *right);
59 int     mono_decimal_from_number   (void *from, MonoDecimal *target);
60
61 #endif