6 #ifndef MESSAGEFORMAT_DATA_MODEL_H 7 #define MESSAGEFORMAT_DATA_MODEL_H 9 #if U_SHOW_CPLUSPLUS_API 11 #if !UCONFIG_NO_NORMALIZATION 13 #if !UCONFIG_NO_FORMATTING 18 #include "unicode/messageformat2_data_model_names.h" 20 #ifndef U_HIDE_DEPRECATED_API 39 static inline std::vector<T> toStdVector(
const T* arr, int32_t len) {
40 std::vector<T> result;
41 for (int32_t i = 0; i < len; i++) {
42 result.push_back(arr[i]);
47 #if defined(U_REAL_MSVC) 51 #pragma warning(disable: 4251) 57 class MessageFormatter;
62 namespace data_model {
126 Literal(
const Literal& other) : thisIsQuoted(other.thisIsQuoted), contents(other.contents) {}
138 swap(l1.thisIsQuoted, l2.thisIsQuoted);
139 swap(l1.contents, l2.contents);
171 bool operator<(
const Literal& other)
const;
197 bool thisIsQuoted =
false;
209 #if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN 210 template class U_I18N_API LocalPointerBase<message2::data_model::Literal>;
211 template class U_I18N_API LocalArray<message2::data_model::Literal>;
213 #if defined(U_REAL_MSVC) 226 #if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN 227 #if defined(U_REAL_MSVC) && defined(_MSVC_STL_VERSION) 228 struct U_I18N_API std::_Nontrivial_dummy_type;
229 template class U_I18N_API std::_Variant_storage_<false, icu::UnicodeString, icu::message2::data_model::Literal>;
231 template class U_I18N_API std::variant<icu::UnicodeString, icu::message2::data_model::Literal>;
232 template class U_I18N_API std::optional<std::variant<icu::UnicodeString, icu::message2::data_model::Literal>>;
233 template class U_I18N_API std::optional<icu::message2::data_model::Literal>;
240 namespace data_model {
266 UBool isVariable()
const;
275 UBool isLiteral()
const;
284 virtual UBool isNull()
const;
304 const Literal& asLiteral()
const;
345 swap(o1.contents, o2.contents);
369 std::optional<std::variant<VariableName, Literal>> contents;
407 const Literal& asLiteral()
const;
414 Key(
const Key& other) : contents(other.contents) {}
422 Key() : contents(std::nullopt) {}
444 swap(k1.contents, k2.contents);
452 Key& operator=(
Key) noexcept;
466 bool operator<(
const Key& other)
const;
489 std::optional<Literal> contents;
500 #if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN 501 template class U_I18N_API LocalPointerBase<message2::data_model::Key>;
502 template class U_I18N_API LocalArray<message2::data_model::Key>;
507 namespace data_model {
531 return toStdVector<Key>(keys.getAlias(), len);
629 swap(s1.len, s2.len);
630 swap(s1.keys, s2.keys);
654 friend class Builder;
655 friend class message2::Checker;
657 friend class message2::Serializer;
662 const Key* getKeysInternal()
const;
670 namespace data_model {
731 swap(o1.name, o2.name);
732 swap(o1.rand, o2.rand);
768 #if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN 769 template class U_I18N_API LocalPointerBase<message2::data_model::Option>;
770 template class U_I18N_API LocalArray<message2::data_model::Option>;
775 namespace data_model {
782 int32_t size()
const;
784 const Option& getOption(int32_t,
UErrorCode&)
const;
785 friend inline void swap(OptionMap& m1, OptionMap& m2) noexcept {
788 swap(m1.bogus, m2.bogus);
789 swap(m1.options, m2.options);
790 swap(m1.len, m2.len);
792 OptionMap() : len(0) {}
793 OptionMap(
const OptionMap&);
794 OptionMap& operator=(OptionMap);
795 std::vector<Option> getOptions()
const {
796 return toStdVector<Option>(options.getAlias(), len);
799 OptionMap(Option*, int32_t);
800 virtual ~OptionMap();
805 bool checkDuplicates =
true;
812 friend inline void swap(Builder& m1, Builder& m2) noexcept {
815 swap(m1.options, m2.options);
816 swap(m1.checkDuplicates, m2.checkDuplicates);
819 Builder(
const Builder&) =
delete;
820 Builder& operator=(Builder) noexcept;
824 friend class message2::Serializer;
827 LocalArray<Option> options;
840 namespace data_model {
874 return options.getOptions();
889 OptionMap::Builder options;
971 swap(o1.name, o2.name);
972 swap(o1.options, o2.options);
998 friend class Builder;
999 friend class message2::Checker;
1001 friend class message2::Serializer;
1006 const OptionMap& getOptionsInternal()
const;
1023 #if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN 1024 template class U_I18N_API std::optional<icu::message2::data_model::Operator>;
1030 namespace message2 {
1031 namespace data_model {
1033 typedef enum UMarkupType {
1096 std::vector<Option>
getOptions()
const {
return options.getOptions(); }
1135 OptionMap::Builder options;
1136 OptionMap::Builder attributes;
1137 UMarkupType type = UMARKUP_COUNT;
1242 friend class Builder;
1243 friend class message2::Serializer;
1248 OptionMap attributes;
1249 const OptionMap& getOptionsInternal()
const {
return options; }
1250 const OptionMap& getAttributesInternal()
const {
return attributes; }
1251 Markup(UMarkupType,
UnicodeString, OptionMap&&, OptionMap&&);
1279 UBool isStandaloneAnnotation()
const;
1290 UBool isFunctionCall()
const;
1314 const Operand& getOperand()
const;
1337 bool hasOperand =
false;
1338 bool hasOperator =
false;
1341 OptionMap::Builder attributes;
1426 swap(e1.rator, e2.rator);
1427 swap(e1.rand, e2.rand);
1428 swap(e1.attributes, e2.attributes);
1460 friend class message2::Serializer;
1476 Expression(
const Operator &rAtor,
const Operand &rAnd,
const OptionMap& attrs) : rator(rAtor), rand(rAnd), attributes(attrs) {}
1477 Expression(
const Operand &rAnd,
const OptionMap& attrs) : rator(std::nullopt), rand(
Operand(rAnd)), attributes(attrs) {}
1478 Expression(
const Operator &rAtor,
const OptionMap& attrs) : rator(rAtor), rand(), attributes(attrs) {}
1479 std::optional<Operator> rator;
1481 OptionMap attributes;
1482 const OptionMap& getAttributesInternal()
const {
return attributes; }
1493 #if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN 1494 template class U_I18N_API LocalPointerBase<message2::data_model::Expression>;
1495 template class U_I18N_API LocalArray<message2::data_model::Expression>;
1499 namespace message2 {
1500 namespace data_model {
1525 UBool isText()
const {
return std::holds_alternative<UnicodeString>(piece); }
1563 const Markup& asMarkup()
const;
1585 swap(p1.piece, p2.piece);
1649 std::variant<UnicodeString, Expression, Markup> piece;
1660 #if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN 1661 template class U_I18N_API LocalPointerBase<message2::data_model::PatternPart>;
1662 template class U_I18N_API LocalArray<message2::data_model::PatternPart>;
1666 namespace message2 {
1667 namespace data_model {
1812 swap(p1.bogus, p2.bogus);
1813 swap(p1.len, p2.len);
1814 swap(p1.parts, p2.parts);
1849 using iterator_category = std::forward_iterator_tag;
1850 using difference_type = std::ptrdiff_t;
1851 using value_type = std::variant<UnicodeString, Expression, Markup>;
1852 using pointer = value_type*;
1853 using reference =
const value_type&;
1871 return patternContents(part);
1890 friend class Builder;
1892 friend class message2::Serializer;
1915 int32_t numParts()
const;
1930 static const std::variant<UnicodeString, Expression, Markup>&
1931 patternContents(
const PatternPart& p) {
return p.piece; }
2025 namespace data_model {
2100 swap(b1.var, b2.var);
2101 swap(b1.expr, b2.expr);
2102 swap(b1.local, b2.local);
2103 b1.updateAnnotation();
2104 b2.updateAnnotation();
2136 friend class message2::Checker;
2138 friend class message2::Parser;
2139 friend class message2::Serializer;
2150 const Operator* annotation =
nullptr;
2152 const OptionMap& getOptionsInternal()
const;
2154 bool hasAnnotation()
const {
return !local && (annotation !=
nullptr); }
2155 void updateAnnotation();
2166 #if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN 2167 template class U_I18N_API LocalPointerBase<message2::data_model::Variant>;
2168 template class U_I18N_API LocalPointerBase<message2::data_model::Binding>;
2169 template class U_I18N_API LocalArray<message2::data_model::Variant>;
2170 template class U_I18N_API LocalArray<message2::data_model::Binding>;
2174 namespace message2 {
2175 using namespace data_model;
2182 #ifndef U_IN_DOXYGEN 2183 class Matcher :
public UObject {
2185 Matcher& operator=(Matcher);
2186 Matcher(
const Matcher&);
2195 friend inline void swap(Matcher& m1, Matcher& m2) noexcept {
2206 swap(m1.selectors, m2.selectors);
2207 swap(m1.numSelectors, m2.numSelectors);
2208 swap(m1.variants, m2.variants);
2209 swap(m1.numVariants, m2.numVariants);
2214 friend class MFDataModel;
2216 Matcher(VariableName* ss, int32_t ns, Variant* vs, int32_t nv);
2225 LocalArray<VariableName> selectors;
2227 int32_t numSelectors = 0;
2229 LocalArray<Variant> variants;
2231 int32_t numVariants = 0;
2244 #if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN 2245 #if defined(U_REAL_MSVC) && defined(_MSVC_STL_VERSION) 2246 template class U_I18N_API std::_Variant_storage_<false, icu::message2::Matcher,icu::message2::data_model::Pattern>;
2248 template class U_I18N_API std::variant<icu::message2::Matcher,icu::message2::data_model::Pattern>;
2254 namespace message2 {
2319 std::vector<Binding> result;
2321 return toStdVector<Binding>(bindings.getAlias(), bindingsLen);
2334 if (std::holds_alternative<Pattern>(body)) {
2337 const Matcher* match = std::get_if<Matcher>(&body);
2339 return toStdVector<VariableName>(match->selectors.getAlias(), match->numSelectors);
2351 if (std::holds_alternative<Pattern>(body)) {
2354 const Matcher* match = std::get_if<Matcher>(&body);
2356 return toStdVector<Variant>(match->variants.getAlias(), match->numVariants);
2368 const Pattern& getPattern()
const;
2406 swap(m1.body, m2.body);
2407 swap(m1.bindings, m2.bindings);
2408 swap(m1.bindingsLen, m2.bindingsLen);
2445 bool hasPattern =
true;
2446 bool hasSelectors =
false;
2449 UVector* selectors =
nullptr;
2450 UVector* variants =
nullptr;
2451 UVector* bindings =
nullptr;
2550 friend class Checker;
2552 friend class Serializer;
2556 bool hasPattern()
const {
return std::holds_alternative<Pattern>(body); }
2562 std::variant<Matcher, Pattern> body;
2566 int32_t bindingsLen = 0;
2568 const Binding* getLocalVariablesInternal()
const;
2570 const Variant* getVariantsInternal()
const;
2572 int32_t numSelectors()
const {
2573 const Matcher* matcher = std::get_if<Matcher>(&body);
2574 return (matcher ==
nullptr ? 0 : matcher->numSelectors);
2576 int32_t numVariants()
const {
2577 const Matcher* matcher = std::get_if<Matcher>(&body);
2578 return (matcher ==
nullptr ? 0 : matcher->numVariants);
2582 void initBindings(
const Binding*);
2584 MFDataModel(
const Builder& builder,
UErrorCode&) noexcept;
2591 #endif // U_HIDE_DEPRECATED_API 2601 #endif // MESSAGEFORMAT_DATA_MODEL_H const SelectorKeys & getKeys() const
Accesses the keys of the variant.
friend void swap(SelectorKeys &s1, SelectorKeys &s2) noexcept
Non-member swap function.
The mutable Markup::Builder class allows the markup to be constructed incrementally.
std::vector< Option > getAttributes() const
Gets the attributes of this expression.
A Variant pairs a list of keys with a pattern It corresponds to the Variant interface defined in http...
std::vector< Option > getAttributes() const
Gets the attributes of this markup.
A PatternPart is a single element (text or expression) in a Pattern.
friend void swap(Variant &v1, Variant &v2) noexcept
Non-member swap function.
bool operator!=(const StringPiece &x, const StringPiece &y)
Global operator != for StringPiece.
Builder & setClose()
Sets this to be an closing markup.
Variant(const SelectorKeys &keys, Pattern &&pattern)
Constructor.
UBool isText() const
Checks if the part is a text part.
Builder & setName(const UnicodeString &n)
Sets the name of this markup.
Literal(const Literal &other)
Copy constructor.
Binding()
Default constructor.
std::vector< Variant > getVariants() const
Accesses the variants.
U_EXPORT UBool operator==(const StringPiece &x, const StringPiece &y)
Global operator == for StringPiece.
friend void swap(Operator &o1, Operator &o2) noexcept
Non-member swap function.
Literal(UBool q, const UnicodeString &s)
Literal constructor.
Iterator end() const
Returns a special value to mark the end of iteration.
const UnicodeString & getName() const
Accesses the left-hand side of the option.
Option()
Default constructor.
friend void swap(Literal &l1, Literal &l2) noexcept
Non-member swap function.
Operator()
Default constructor.
std::vector< Key > getKeys() const
Returns the underlying list of keys.
SelectorKeys()
Default constructor.
UBool isStandalone() const
Checks if this markup is an standalone tag.
Iterator begin() const
Returns the parts of this pattern.
std::vector< VariableName > getSelectors() const
Accesses the selectors.
UBool isQuoted() const
Determines if this literal appeared as a quoted literal in the message.
Option(const UnicodeString &n, Operand &&r)
Constructor.
Markup()
Default constructor.
The Literal class corresponds to the literal nonterminal in the MessageFormat 2 grammar, https://github.com/unicode-org/message-format-wg/blob/main/spec/message.abnf and the Literal interface defined in // https://github.com/unicode-org/message-format-wg/blob/main/spec/data-model.md#expressions.
An Option pairs an option name with an Operand.
The mutable Pattern::Builder class allows the pattern to be constructed one part at a time...
Iterator operator++()
Increment operator (advances to the next iterator position)
Key(const Literal &lit)
Literal key constructor.
#define U_I18N_API
Set to export library symbols from inside the i18n library, and to import them from outside...
Operand(const Literal &l)
Literal operand constructor.
The mutable SelectorKeys::Builder class allows the key list to be constructed one key at a time...
The Pattern::Iterator class provides an iterator over the formattable parts of a pattern.
Operand()
Default constructor.
friend void swap(Expression &e1, Expression &e2) noexcept
Non-member swap function.
The mutable Expression::Builder class allows the operator to be constructed incrementally.
The Markup class corresponds to the markup nonterminal in the MessageFormat 2 grammar and the markup ...
Key(const Key &other)
Copy constructor.
C++ API: "Smart pointers" for use with and in ICU4C C++ code.
The MFDataModel class describes a parsed representation of the text of a message. ...
friend void swap(Option &o1, Option &o2) noexcept
Non-member swap function.
friend void swap(Binding &b1, Binding &b2) noexcept
Non-member swap function.
"Smart pointer" class, deletes objects via the C++ array delete[] operator.
std::vector< Option > getOptions() const
Gets the options of this markup.
reference operator*() const
Dereference operator (gets the element at the current iterator position)
UBool isExpression() const
Checks if the part is an expression part.
The Operator class corresponds to the FunctionRef type in the Expression interface defined in https:/...
friend void swap(Key &k1, Key &k2) noexcept
Non-member swap function.
friend void swap(MFDataModel &m1, MFDataModel &m2) noexcept
Non-member swap function.
PatternPart(Expression &&e)
Expression part constructor.
The mutable MFDataModel::Builder class allows the data model to be constructed incrementally.
PatternPart(const UnicodeString &t)
Text part constructor.
Pattern()
Default constructor.
PatternPart(Markup &&m)
Markup part constructor.
Key()
Wildcard constructor; constructs a Key representing the catchall or wildcard key, '*'...
The Operand class corresponds to the operand nonterminal in the MessageFormat 2 grammar, https://github.com/unicode-org/message-format-wg/blob/main/spec/message.abnf .
Builder & setOpen()
Sets this to be an opening markup.
The Expression class corresponds to the expression nonterminal in the MessageFormat 2 grammar and the...
Binding(const VariableName &v, Expression &&e)
Constructor.
A Binding pairs a variable name with an expression.
UErrorCode
Standard ICU4C error code type, a substitute for exceptions.
The Key class corresponds to the key nonterminal in the MessageFormat 2 grammar, https://github.com/unicode-org/message-format-wg/blob/main/spec/message.abnf .
UBool isMarkup() const
Checks if the part is a markup part.
UBool isOpen() const
Checks if this markup is an opening tag.
UBool isLocal() const
Returns true if and only if this binding represents a local declaration.
Operand(const UnicodeString &v)
Variable operand constructor.
Basic definitions for ICU, for both C and C++ APIs.
UBool isWildcard() const
Determines if this is a wildcard key.
std::vector< Option > getOptions() const
Accesses function options.
A Pattern is a sequence of formattable parts.
const Pattern & getPattern() const
Accesses the pattern of the variant.
UnicodeString is a string class that stores Unicode characters directly and provides similar function...
The SelectorKeys class represents the key list for a single variant.
friend void swap(PatternPart &p1, PatternPart &p2) noexcept
Non-member swap function.
const VariableName & getVariable() const
Accesses the left-hand side of the binding.
UObject is the common ICU "boilerplate" class.
const UnicodeString & getName() const
Gets the name of this markup.
UMemory is the common ICU base class.
Builder & setStandalone()
Sets this to be a standalone markup.
std::vector< Binding > getLocalVariables() const
Accesses the local variable declarations for this data model.
friend void swap(Operand &o1, Operand &o2) noexcept
Non-member swap function.
int8_t UBool
The ICU boolean type, a signed-byte integer.
friend void swap(Pattern &p1, Pattern &p2) noexcept
Non-member swap function.
UBool isClose() const
Checks if this markup is an closing tag.
const Operand & getValue() const
Accesses the right-hand side of the option.
The mutable Operator::Builder class allows the operator to be constructed incrementally.