Decimal.hpp (13746B)
1 #ifndef icu4x_Decimal_HPP 2 #define icu4x_Decimal_HPP 3 4 #include "Decimal.d.hpp" 5 6 #include <stdio.h> 7 #include <stdint.h> 8 #include <stddef.h> 9 #include <stdbool.h> 10 #include <memory> 11 #include <functional> 12 #include <optional> 13 #include <cstdlib> 14 #include "../diplomat_runtime.hpp" 15 #include "DecimalLimitError.hpp" 16 #include "DecimalParseError.hpp" 17 #include "DecimalRoundingIncrement.hpp" 18 #include "DecimalSign.hpp" 19 #include "DecimalSignDisplay.hpp" 20 #include "DecimalSignedRoundingMode.hpp" 21 22 23 namespace icu4x { 24 namespace capi { 25 extern "C" { 26 27 icu4x::capi::Decimal* icu4x_Decimal_from_int32_mv1(int32_t v); 28 29 icu4x::capi::Decimal* icu4x_Decimal_from_uint32_mv1(uint32_t v); 30 31 icu4x::capi::Decimal* icu4x_Decimal_from_int64_mv1(int64_t v); 32 33 icu4x::capi::Decimal* icu4x_Decimal_from_uint64_mv1(uint64_t v); 34 35 typedef struct icu4x_Decimal_from_double_with_integer_precision_mv1_result {union {icu4x::capi::Decimal* ok; }; bool is_ok;} icu4x_Decimal_from_double_with_integer_precision_mv1_result; 36 icu4x_Decimal_from_double_with_integer_precision_mv1_result icu4x_Decimal_from_double_with_integer_precision_mv1(double f); 37 38 typedef struct icu4x_Decimal_from_double_with_lower_magnitude_mv1_result {union {icu4x::capi::Decimal* ok; }; bool is_ok;} icu4x_Decimal_from_double_with_lower_magnitude_mv1_result; 39 icu4x_Decimal_from_double_with_lower_magnitude_mv1_result icu4x_Decimal_from_double_with_lower_magnitude_mv1(double f, int16_t magnitude); 40 41 typedef struct icu4x_Decimal_from_double_with_significant_digits_mv1_result {union {icu4x::capi::Decimal* ok; }; bool is_ok;} icu4x_Decimal_from_double_with_significant_digits_mv1_result; 42 icu4x_Decimal_from_double_with_significant_digits_mv1_result icu4x_Decimal_from_double_with_significant_digits_mv1(double f, uint8_t digits); 43 44 typedef struct icu4x_Decimal_from_double_with_round_trip_precision_mv1_result {union {icu4x::capi::Decimal* ok; }; bool is_ok;} icu4x_Decimal_from_double_with_round_trip_precision_mv1_result; 45 icu4x_Decimal_from_double_with_round_trip_precision_mv1_result icu4x_Decimal_from_double_with_round_trip_precision_mv1(double f); 46 47 typedef struct icu4x_Decimal_from_string_mv1_result {union {icu4x::capi::Decimal* ok; icu4x::capi::DecimalParseError err;}; bool is_ok;} icu4x_Decimal_from_string_mv1_result; 48 icu4x_Decimal_from_string_mv1_result icu4x_Decimal_from_string_mv1(diplomat::capi::DiplomatStringView v); 49 50 uint8_t icu4x_Decimal_digit_at_mv1(const icu4x::capi::Decimal* self, int16_t magnitude); 51 52 int16_t icu4x_Decimal_magnitude_start_mv1(const icu4x::capi::Decimal* self); 53 54 int16_t icu4x_Decimal_magnitude_end_mv1(const icu4x::capi::Decimal* self); 55 56 int16_t icu4x_Decimal_nonzero_magnitude_start_mv1(const icu4x::capi::Decimal* self); 57 58 int16_t icu4x_Decimal_nonzero_magnitude_end_mv1(const icu4x::capi::Decimal* self); 59 60 bool icu4x_Decimal_is_zero_mv1(const icu4x::capi::Decimal* self); 61 62 void icu4x_Decimal_multiply_pow10_mv1(icu4x::capi::Decimal* self, int16_t power); 63 64 icu4x::capi::DecimalSign icu4x_Decimal_sign_mv1(const icu4x::capi::Decimal* self); 65 66 void icu4x_Decimal_set_sign_mv1(icu4x::capi::Decimal* self, icu4x::capi::DecimalSign sign); 67 68 void icu4x_Decimal_apply_sign_display_mv1(icu4x::capi::Decimal* self, icu4x::capi::DecimalSignDisplay sign_display); 69 70 void icu4x_Decimal_trim_start_mv1(icu4x::capi::Decimal* self); 71 72 void icu4x_Decimal_trim_end_mv1(icu4x::capi::Decimal* self); 73 74 void icu4x_Decimal_trim_end_if_integer_mv1(icu4x::capi::Decimal* self); 75 76 void icu4x_Decimal_pad_start_mv1(icu4x::capi::Decimal* self, int16_t position); 77 78 void icu4x_Decimal_pad_end_mv1(icu4x::capi::Decimal* self, int16_t position); 79 80 void icu4x_Decimal_set_max_position_mv1(icu4x::capi::Decimal* self, int16_t position); 81 82 void icu4x_Decimal_round_mv1(icu4x::capi::Decimal* self, int16_t position); 83 84 void icu4x_Decimal_ceil_mv1(icu4x::capi::Decimal* self, int16_t position); 85 86 void icu4x_Decimal_expand_mv1(icu4x::capi::Decimal* self, int16_t position); 87 88 void icu4x_Decimal_floor_mv1(icu4x::capi::Decimal* self, int16_t position); 89 90 void icu4x_Decimal_trunc_mv1(icu4x::capi::Decimal* self, int16_t position); 91 92 void icu4x_Decimal_round_with_mode_mv1(icu4x::capi::Decimal* self, int16_t position, icu4x::capi::DecimalSignedRoundingMode mode); 93 94 void icu4x_Decimal_round_with_mode_and_increment_mv1(icu4x::capi::Decimal* self, int16_t position, icu4x::capi::DecimalSignedRoundingMode mode, icu4x::capi::DecimalRoundingIncrement increment); 95 96 typedef struct icu4x_Decimal_concatenate_end_mv1_result { bool is_ok;} icu4x_Decimal_concatenate_end_mv1_result; 97 icu4x_Decimal_concatenate_end_mv1_result icu4x_Decimal_concatenate_end_mv1(icu4x::capi::Decimal* self, icu4x::capi::Decimal* other); 98 99 void icu4x_Decimal_to_string_mv1(const icu4x::capi::Decimal* self, diplomat::capi::DiplomatWrite* write); 100 101 void icu4x_Decimal_destroy_mv1(Decimal* self); 102 103 } // extern "C" 104 } // namespace capi 105 } // namespace 106 107 inline std::unique_ptr<icu4x::Decimal> icu4x::Decimal::from(int32_t v) { 108 auto result = icu4x::capi::icu4x_Decimal_from_int32_mv1(v); 109 return std::unique_ptr<icu4x::Decimal>(icu4x::Decimal::FromFFI(result)); 110 } 111 112 inline std::unique_ptr<icu4x::Decimal> icu4x::Decimal::from(uint32_t v) { 113 auto result = icu4x::capi::icu4x_Decimal_from_uint32_mv1(v); 114 return std::unique_ptr<icu4x::Decimal>(icu4x::Decimal::FromFFI(result)); 115 } 116 117 inline std::unique_ptr<icu4x::Decimal> icu4x::Decimal::from(int64_t v) { 118 auto result = icu4x::capi::icu4x_Decimal_from_int64_mv1(v); 119 return std::unique_ptr<icu4x::Decimal>(icu4x::Decimal::FromFFI(result)); 120 } 121 122 inline std::unique_ptr<icu4x::Decimal> icu4x::Decimal::from(uint64_t v) { 123 auto result = icu4x::capi::icu4x_Decimal_from_uint64_mv1(v); 124 return std::unique_ptr<icu4x::Decimal>(icu4x::Decimal::FromFFI(result)); 125 } 126 127 inline diplomat::result<std::unique_ptr<icu4x::Decimal>, icu4x::DecimalLimitError> icu4x::Decimal::from_double_with_integer_precision(double f) { 128 auto result = icu4x::capi::icu4x_Decimal_from_double_with_integer_precision_mv1(f); 129 return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::Decimal>, icu4x::DecimalLimitError>(diplomat::Ok<std::unique_ptr<icu4x::Decimal>>(std::unique_ptr<icu4x::Decimal>(icu4x::Decimal::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::Decimal>, icu4x::DecimalLimitError>(diplomat::Err<icu4x::DecimalLimitError>(icu4x::DecimalLimitError {})); 130 } 131 132 inline diplomat::result<std::unique_ptr<icu4x::Decimal>, icu4x::DecimalLimitError> icu4x::Decimal::from_double_with_lower_magnitude(double f, int16_t magnitude) { 133 auto result = icu4x::capi::icu4x_Decimal_from_double_with_lower_magnitude_mv1(f, 134 magnitude); 135 return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::Decimal>, icu4x::DecimalLimitError>(diplomat::Ok<std::unique_ptr<icu4x::Decimal>>(std::unique_ptr<icu4x::Decimal>(icu4x::Decimal::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::Decimal>, icu4x::DecimalLimitError>(diplomat::Err<icu4x::DecimalLimitError>(icu4x::DecimalLimitError {})); 136 } 137 138 inline diplomat::result<std::unique_ptr<icu4x::Decimal>, icu4x::DecimalLimitError> icu4x::Decimal::from_double_with_significant_digits(double f, uint8_t digits) { 139 auto result = icu4x::capi::icu4x_Decimal_from_double_with_significant_digits_mv1(f, 140 digits); 141 return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::Decimal>, icu4x::DecimalLimitError>(diplomat::Ok<std::unique_ptr<icu4x::Decimal>>(std::unique_ptr<icu4x::Decimal>(icu4x::Decimal::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::Decimal>, icu4x::DecimalLimitError>(diplomat::Err<icu4x::DecimalLimitError>(icu4x::DecimalLimitError {})); 142 } 143 144 inline diplomat::result<std::unique_ptr<icu4x::Decimal>, icu4x::DecimalLimitError> icu4x::Decimal::from_double_with_round_trip_precision(double f) { 145 auto result = icu4x::capi::icu4x_Decimal_from_double_with_round_trip_precision_mv1(f); 146 return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::Decimal>, icu4x::DecimalLimitError>(diplomat::Ok<std::unique_ptr<icu4x::Decimal>>(std::unique_ptr<icu4x::Decimal>(icu4x::Decimal::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::Decimal>, icu4x::DecimalLimitError>(diplomat::Err<icu4x::DecimalLimitError>(icu4x::DecimalLimitError {})); 147 } 148 149 inline diplomat::result<std::unique_ptr<icu4x::Decimal>, icu4x::DecimalParseError> icu4x::Decimal::from_string(std::string_view v) { 150 auto result = icu4x::capi::icu4x_Decimal_from_string_mv1({v.data(), v.size()}); 151 return result.is_ok ? diplomat::result<std::unique_ptr<icu4x::Decimal>, icu4x::DecimalParseError>(diplomat::Ok<std::unique_ptr<icu4x::Decimal>>(std::unique_ptr<icu4x::Decimal>(icu4x::Decimal::FromFFI(result.ok)))) : diplomat::result<std::unique_ptr<icu4x::Decimal>, icu4x::DecimalParseError>(diplomat::Err<icu4x::DecimalParseError>(icu4x::DecimalParseError::FromFFI(result.err))); 152 } 153 154 inline uint8_t icu4x::Decimal::digit_at(int16_t magnitude) const { 155 auto result = icu4x::capi::icu4x_Decimal_digit_at_mv1(this->AsFFI(), 156 magnitude); 157 return result; 158 } 159 160 inline int16_t icu4x::Decimal::magnitude_start() const { 161 auto result = icu4x::capi::icu4x_Decimal_magnitude_start_mv1(this->AsFFI()); 162 return result; 163 } 164 165 inline int16_t icu4x::Decimal::magnitude_end() const { 166 auto result = icu4x::capi::icu4x_Decimal_magnitude_end_mv1(this->AsFFI()); 167 return result; 168 } 169 170 inline int16_t icu4x::Decimal::nonzero_magnitude_start() const { 171 auto result = icu4x::capi::icu4x_Decimal_nonzero_magnitude_start_mv1(this->AsFFI()); 172 return result; 173 } 174 175 inline int16_t icu4x::Decimal::nonzero_magnitude_end() const { 176 auto result = icu4x::capi::icu4x_Decimal_nonzero_magnitude_end_mv1(this->AsFFI()); 177 return result; 178 } 179 180 inline bool icu4x::Decimal::is_zero() const { 181 auto result = icu4x::capi::icu4x_Decimal_is_zero_mv1(this->AsFFI()); 182 return result; 183 } 184 185 inline void icu4x::Decimal::multiply_pow10(int16_t power) { 186 icu4x::capi::icu4x_Decimal_multiply_pow10_mv1(this->AsFFI(), 187 power); 188 } 189 190 inline icu4x::DecimalSign icu4x::Decimal::sign() const { 191 auto result = icu4x::capi::icu4x_Decimal_sign_mv1(this->AsFFI()); 192 return icu4x::DecimalSign::FromFFI(result); 193 } 194 195 inline void icu4x::Decimal::set_sign(icu4x::DecimalSign sign) { 196 icu4x::capi::icu4x_Decimal_set_sign_mv1(this->AsFFI(), 197 sign.AsFFI()); 198 } 199 200 inline void icu4x::Decimal::apply_sign_display(icu4x::DecimalSignDisplay sign_display) { 201 icu4x::capi::icu4x_Decimal_apply_sign_display_mv1(this->AsFFI(), 202 sign_display.AsFFI()); 203 } 204 205 inline void icu4x::Decimal::trim_start() { 206 icu4x::capi::icu4x_Decimal_trim_start_mv1(this->AsFFI()); 207 } 208 209 inline void icu4x::Decimal::trim_end() { 210 icu4x::capi::icu4x_Decimal_trim_end_mv1(this->AsFFI()); 211 } 212 213 inline void icu4x::Decimal::trim_end_if_integer() { 214 icu4x::capi::icu4x_Decimal_trim_end_if_integer_mv1(this->AsFFI()); 215 } 216 217 inline void icu4x::Decimal::pad_start(int16_t position) { 218 icu4x::capi::icu4x_Decimal_pad_start_mv1(this->AsFFI(), 219 position); 220 } 221 222 inline void icu4x::Decimal::pad_end(int16_t position) { 223 icu4x::capi::icu4x_Decimal_pad_end_mv1(this->AsFFI(), 224 position); 225 } 226 227 inline void icu4x::Decimal::set_max_position(int16_t position) { 228 icu4x::capi::icu4x_Decimal_set_max_position_mv1(this->AsFFI(), 229 position); 230 } 231 232 inline void icu4x::Decimal::round(int16_t position) { 233 icu4x::capi::icu4x_Decimal_round_mv1(this->AsFFI(), 234 position); 235 } 236 237 inline void icu4x::Decimal::ceil(int16_t position) { 238 icu4x::capi::icu4x_Decimal_ceil_mv1(this->AsFFI(), 239 position); 240 } 241 242 inline void icu4x::Decimal::expand(int16_t position) { 243 icu4x::capi::icu4x_Decimal_expand_mv1(this->AsFFI(), 244 position); 245 } 246 247 inline void icu4x::Decimal::floor(int16_t position) { 248 icu4x::capi::icu4x_Decimal_floor_mv1(this->AsFFI(), 249 position); 250 } 251 252 inline void icu4x::Decimal::trunc(int16_t position) { 253 icu4x::capi::icu4x_Decimal_trunc_mv1(this->AsFFI(), 254 position); 255 } 256 257 inline void icu4x::Decimal::round_with_mode(int16_t position, icu4x::DecimalSignedRoundingMode mode) { 258 icu4x::capi::icu4x_Decimal_round_with_mode_mv1(this->AsFFI(), 259 position, 260 mode.AsFFI()); 261 } 262 263 inline void icu4x::Decimal::round_with_mode_and_increment(int16_t position, icu4x::DecimalSignedRoundingMode mode, icu4x::DecimalRoundingIncrement increment) { 264 icu4x::capi::icu4x_Decimal_round_with_mode_and_increment_mv1(this->AsFFI(), 265 position, 266 mode.AsFFI(), 267 increment.AsFFI()); 268 } 269 270 inline diplomat::result<std::monostate, std::monostate> icu4x::Decimal::concatenate_end(icu4x::Decimal& other) { 271 auto result = icu4x::capi::icu4x_Decimal_concatenate_end_mv1(this->AsFFI(), 272 other.AsFFI()); 273 return result.is_ok ? diplomat::result<std::monostate, std::monostate>(diplomat::Ok<std::monostate>()) : diplomat::result<std::monostate, std::monostate>(diplomat::Err<std::monostate>()); 274 } 275 276 inline std::string icu4x::Decimal::to_string() const { 277 std::string output; 278 diplomat::capi::DiplomatWrite write = diplomat::WriteFromString(output); 279 icu4x::capi::icu4x_Decimal_to_string_mv1(this->AsFFI(), 280 &write); 281 return output; 282 } 283 284 inline const icu4x::capi::Decimal* icu4x::Decimal::AsFFI() const { 285 return reinterpret_cast<const icu4x::capi::Decimal*>(this); 286 } 287 288 inline icu4x::capi::Decimal* icu4x::Decimal::AsFFI() { 289 return reinterpret_cast<icu4x::capi::Decimal*>(this); 290 } 291 292 inline const icu4x::Decimal* icu4x::Decimal::FromFFI(const icu4x::capi::Decimal* ptr) { 293 return reinterpret_cast<const icu4x::Decimal*>(ptr); 294 } 295 296 inline icu4x::Decimal* icu4x::Decimal::FromFFI(icu4x::capi::Decimal* ptr) { 297 return reinterpret_cast<icu4x::Decimal*>(ptr); 298 } 299 300 inline void icu4x::Decimal::operator delete(void* ptr) { 301 icu4x::capi::icu4x_Decimal_destroy_mv1(reinterpret_cast<icu4x::capi::Decimal*>(ptr)); 302 } 303 304 305 #endif // icu4x_Decimal_HPP