v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
js-duration-format.h
Go to the documentation of this file.
1// Copyright 2022 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef V8_OBJECTS_JS_DURATION_FORMAT_H_
6#define V8_OBJECTS_JS_DURATION_FORMAT_H_
7
8#ifndef V8_INTL_SUPPORT
9#error Internationalization is expected to be enabled.
10#endif // V8_INTL_SUPPORT
11
13#include "src/heap/factory.h"
14#include "src/objects/managed.h"
15#include "src/objects/objects.h"
16
17// Has to be the last include (doesn't have include guards):
19
20namespace U_ICU_NAMESPACE {
21class Locale;
22namespace number {
23class LocalizedNumberFormatter;
24} // namespace number
25} // namespace U_ICU_NAMESPACE
26
27namespace v8 {
28namespace internal {
29
30#include "torque-generated/src/objects/js-duration-format-tq.inc"
31
33 : public TorqueGeneratedJSDurationFormat<JSDurationFormat, JSObject> {
34 public:
35 // Creates duration format object with properties derived from input
36 // locales and options.
38 Isolate* isolate, DirectHandle<Map> map, DirectHandle<Object> locales,
39 DirectHandle<Object> options);
40
42 Isolate* isolate, DirectHandle<JSDurationFormat> format_holder);
43
46 Handle<Object> duration);
47
50 Handle<Object> duration);
51
52 V8_EXPORT_PRIVATE static const std::set<std::string>& GetAvailableLocales();
53
54 enum class Display {
55 kAuto,
56 kAlways,
57
59 };
60
61 enum class Style {
62 kLong,
63 kShort,
64 kNarrow,
66
68 };
69
70 // To optimize per object memory usage, we use 2 bits
71 // to store one of the four possible time separators encoded in
72 // icu/source/data/locales/$locale/NumberElements/$numberingSystem/timeSeparator
73 enum class Separator {
74 kColon, // U+003A
75 kFullStop, // U+002E
76 kFullwidthColon, // U+FF1A
78
80 };
81
82 // The ordering of these values is significant, because sub-ranges are
83 // encoded using bitfields.
84 enum class FieldStyle {
85 kLong,
86 kShort,
87 kNarrow,
89 k2Digit,
92
96 };
97
98#define DECLARE_INLINE_SETTER_GETTER(T, n) \
99 inline void set_##n(T); \
100 inline T n() const;
101
102#define DECLARE_INLINE_DISPLAY_SETTER_GETTER(f) \
103 DECLARE_INLINE_SETTER_GETTER(Display, f##_display)
104
105#define DECLARE_INLINE_FIELD_STYLE_SETTER_GETTER(f) \
106 DECLARE_INLINE_SETTER_GETTER(FieldStyle, f##_style)
107
118
121
132
133#undef DECLARE_INLINE_SETTER_GETTER
134#undef DECLARE_INLINE_STYLE_SETTER_GETTER
135#undef DECLARE_INLINE_FIELD_STYLE_SETTER_GETTER
136
137 // Since we store the fractional_digits in 4 bits but only use 0-9 as valid
138 // value. We use value 15 (max of 4 bits) to denote "undefined".
139 static const uint32_t kUndefinedFractionalDigits = 15;
140 inline void set_fractional_digits(int32_t digits);
141 inline int32_t fractional_digits() const;
142
143 // Bit positions in |flags|.
144 DEFINE_TORQUE_GENERATED_JS_DURATION_FORMAT_DISPLAY_FLAGS()
145 DEFINE_TORQUE_GENERATED_JS_DURATION_FORMAT_STYLE_FLAGS()
146
147 static_assert(YearsDisplayBit::is_valid(Display::kMax));
148 static_assert(MonthsDisplayBit::is_valid(Display::kMax));
149 static_assert(WeeksDisplayBit::is_valid(Display::kMax));
150 static_assert(DaysDisplayBit::is_valid(Display::kMax));
151 static_assert(HoursDisplayBit::is_valid(Display::kMax));
152 static_assert(MinutesDisplayBit::is_valid(Display::kMax));
153 static_assert(SecondsDisplayBit::is_valid(Display::kMax));
154 static_assert(MillisecondsDisplayBit::is_valid(Display::kMax));
155 static_assert(MicrosecondsDisplayBit::is_valid(Display::kMax));
156 static_assert(NanosecondsDisplayBit::is_valid(Display::kMax));
157
158 static_assert(StyleBits::is_valid(Style::kMax));
159
160 static_assert(YearsStyleBits::is_valid(FieldStyle::kStyle3Max));
161 static_assert(MonthsStyleBits::is_valid(FieldStyle::kStyle3Max));
162 static_assert(WeeksStyleBits::is_valid(FieldStyle::kStyle3Max));
163 static_assert(DaysStyleBits::is_valid(FieldStyle::kStyle3Max));
164 static_assert(HoursStyleBits::is_valid(FieldStyle::kStyle5Max));
165 static_assert(MinutesStyleBits::is_valid(FieldStyle::kStyle5Max));
166 static_assert(SecondsStyleBits::is_valid(FieldStyle::kStyle5Max));
167 static_assert(MillisecondsStyleBits::is_valid(FieldStyle::kStyle4Max));
168 static_assert(MicrosecondsStyleBits::is_valid(FieldStyle::kStyle4Max));
169 static_assert(NanosecondsStyleBits::is_valid(FieldStyle::kStyle4Max));
170
171 DECL_ACCESSORS(icu_locale, Tagged<Managed<icu::Locale>>)
173 Tagged<Managed<icu::number::LocalizedNumberFormatter>>)
174
176
178};
179
180} // namespace internal
181} // namespace v8
182
183#include "src/objects/object-macros-undef.h"
184
185#endif // V8_OBJECTS_JS_DURATION_FORMAT_H_
static V8_WARN_UNUSED_RESULT MaybeDirectHandle< JSArray > FormatToParts(Isolate *isolate, DirectHandle< JSDurationFormat > df, Handle< Object > duration)
static V8_EXPORT_PRIVATE const std::set< std::string > & GetAvailableLocales()
static const uint32_t kUndefinedFractionalDigits
static V8_WARN_UNUSED_RESULT MaybeDirectHandle< String > Format(Isolate *isolate, DirectHandle< JSDurationFormat > df, Handle< Object > duration)
static V8_WARN_UNUSED_RESULT MaybeDirectHandle< JSDurationFormat > New(Isolate *isolate, DirectHandle< Map > map, DirectHandle< Object > locales, DirectHandle< Object > options)
static V8_WARN_UNUSED_RESULT DirectHandle< JSObject > ResolvedOptions(Isolate *isolate, DirectHandle< JSDurationFormat > format_holder)
JSDurationFormat::FieldStyle style
#define DECLARE_INLINE_DISPLAY_SETTER_GETTER(f)
#define DECLARE_INLINE_SETTER_GETTER(T, n)
#define DECLARE_INLINE_FIELD_STYLE_SETTER_GETTER(f)
double years
double months
double weeks
double days
#define DECL_ACCESSORS(name,...)
#define DECL_PRINTER(Name)
#define TQ_OBJECT_CONSTRUCTORS(Type)
#define V8_EXPORT_PRIVATE
Definition macros.h:460
#define V8_WARN_UNUSED_RESULT
Definition v8config.h:671