9#ifndef LLVM_SUPPORT_YAMLTRAITS_H
10#define LLVM_SUPPORT_YAMLTRAITS_H
34#include <system_error>
334 using check = std::tuple<SameType<SignatureInput, &U::input>,
347 using check = std::tuple<SameType<SignatureInput, &U::input>,
361 using check = std::tuple<SameType<SignatureInput, &U::input>,
450 static constexpr bool value =
false;
454 template <
class U>
using check =
decltype(&U::flow);
462 :
public std::bool_constant<has_SequenceMethodTraits<T>::value> {};
484 return Input.ltrim(
"0123456789");
489 if (S.
empty() || S ==
"+" || S ==
"-")
492 if (S ==
".nan" || S ==
".NaN" || S ==
".NAN")
507 return S.
size() > 2 &&
522 (S.
size() > 1 && std::strchr(
"0123456789", S[1]) ==
nullptr)))
541 if (S.
front() ==
'.') {
544 }
else if (S.
front() ==
'e' || S.
front() ==
'E') {
545 State = FoundExponent;
551 if (State == FoundDot) {
557 State = FoundExponent;
564 assert(State == FoundExponent &&
"Should have found exponent at this point.");
574 return skipDigits(S).empty();
578 return S ==
"null" || S ==
"Null" || S ==
"NULL" || S ==
"~";
583 return S ==
"true" || S ==
"True" || S ==
"TRUE" || S ==
"false" ||
584 S ==
"False" || S ==
"FALSE";
604 if (ForcePreserveAsString) {
616 if (std::strchr(R
"(-?:\,[]{}#&*!|>'"%@`)", S[0]) != nullptr)
619 for (
unsigned char C : S) {
666 return MaxQuotingNeeded;
669template <
typename T,
typename Context>
671 :
public std::integral_constant<bool,
672 !has_ScalarEnumerationTraits<T>::value &&
673 !has_ScalarBitSetTraits<T>::value &&
674 !has_ScalarTraits<T>::value &&
675 !has_BlockScalarTraits<T>::value &&
676 !has_TaggedScalarTraits<T>::value &&
677 !has_MappingTraits<T, Context>::value &&
678 !has_SequenceTraits<T>::value &&
679 !has_CustomMappingTraits<T>::value &&
680 !has_DocumentListTraits<T>::value &&
681 !has_PolymorphicTraits<T>::value> {};
683template <
typename T,
typename Context>
685 :
public std::bool_constant<has_MappingTraits<T, Context>::value &&
686 has_MappingValidateTraits<T, Context>::value> {
689template <
typename T,
typename Context>
691 :
public std::bool_constant<has_MappingTraits<T, Context>::value &&
692 !has_MappingValidateTraits<T, Context>::value> {
698 IO(
void *Ctxt =
nullptr);
717 virtual bool preflightKey(
const char *,
bool,
bool,
bool &,
void *&) = 0;
719 virtual std::vector<StringRef>
keys() = 0;
740 virtual std::error_code
error() = 0;
743 template <
typename T>
751 template <
typename T>
762 FBT Res =
static_cast<typename FBT::BaseType
>(Val);
763 yamlize(*
this, Res,
true, Context);
764 Val =
static_cast<T>(
static_cast<typename FBT::BaseType
>(Res));
768 template <
typename T>
771 Val =
static_cast<T>(Val | ConstVal);
776 template <
typename T>
779 Val =
static_cast<T>(Val | ConstVal);
783 template <
typename T>
786 Val = Val | ConstVal;
789 template <
typename T>
793 Val = Val | ConstVal;
796 void *getContext()
const;
797 void setContext(
void *);
801 this->processKey(
Key, Val,
true, Ctx);
804 template <
typename T,
typename Context>
806 this->processKey(
Key, Val,
true, Ctx);
814 template <
typename T,
typename DefaultT>
820 template <
typename T,
typename Context>
827 this->processKey(
Key, Val,
false, Ctx);
830 template <
typename T,
typename Context>
833 this->processKeyWithDefault(
Key, Val, std::optional<T>(),
837 template <
typename T,
typename Context,
typename DefaultT>
840 static_assert(std::is_convertible<DefaultT, T>::value,
841 "Default type must be implicitly convertible to value type!");
842 this->processKeyWithDefault(
Key, Val,
static_cast<const T &
>(
Default),
847 template <
typename T,
typename Context>
848 void processKeyWithDefault(
const char *
Key, std::optional<T> &Val,
849 const std::optional<T> &DefaultValue,
852 template <
typename T,
typename Context>
853 void processKeyWithDefault(
const char *
Key,
T &Val,
const T &DefaultValue,
857 const bool sameAsDefault = outputting() && Val == DefaultValue;
858 if (this->preflightKey(
Key,
Required, sameAsDefault, UseDefault,
861 this->postflightKey(SaveInfo);
868 template <
typename T,
typename Context>
869 void processKey(
const char *Key,
T &Val,
bool Required,
Context &Ctx) {
872 if (this->preflightKey(Key, Required,
false, UseDefault, SaveInfo)) {
873 yamlize(*
this, Val, Required, Ctx);
874 this->postflightKey(SaveInfo);
884template <
typename T,
typename Context>
896std::enable_if_t<has_ScalarEnumerationTraits<T>::value,
void>
904std::enable_if_t<has_ScalarBitSetTraits<T>::value,
void>
916std::enable_if_t<has_ScalarTraits<T>::value,
void>
yamlize(
IO &io,
T &Val,
bool,
928 if (!Result.empty()) {
935std::enable_if_t<has_BlockScalarTraits<T>::value,
void>
954std::enable_if_t<has_TaggedScalarTraits<T>::value,
void>
957 std::string ScalarStorage, TagStorage;
972 if (!Result.empty()) {
980template <
typename T,
typename Context>
991template <
typename T,
typename Context>
992std::enable_if_t<validatedMappingTraits<T, Context>::value,
void>
1001 errs() << Err <<
"\n";
1002 assert(Err.empty() &&
"invalid struct trying to be written as yaml");
1017template <
typename T,
typename Context>
1032template <
typename T,
typename Context>
1033std::enable_if_t<unvalidatedMappingTraits<T, Context>::value,
void>
1048template <
typename T>
1049std::enable_if_t<has_CustomMappingTraits<T>::value,
void>
1063template <
typename T>
1064std::enable_if_t<has_PolymorphicTraits<T>::value,
void>
1077template <
typename T>
1078std::enable_if_t<missingTraits<T, EmptyContext>::value,
void>
1083template <
typename T,
typename Context>
1084std::enable_if_t<has_SequenceTraits<T>::value,
void>
1089 for (
unsigned i = 0; i <
count; ++i) {
1100 for (
unsigned i = 0; i <
count; ++i) {
1192template <
typename value_type, llvm::endianness endian,
size_t alignment>
1194 value_type, endian, alignment>,
1195 std::enable_if_t<has_ScalarTraits<value_type>::value>> {
1216template <
typename value_type, llvm::endianness endian,
size_t alignment>
1218 support::detail::packed_endian_specific_integral<value_type, endian,
1220 std::enable_if_t<has_ScalarEnumerationTraits<value_type>::value>> {
1232template <
typename value_type, llvm::endianness endian,
size_t alignment>
1234 support::detail::packed_endian_specific_integral<value_type, endian,
1236 std::enable_if_t<has_ScalarBitSetTraits<value_type>::value>> {
1251 : io(i_o), BufPtr(nullptr), Result(Obj) {
1252 if (io.outputting()) {
1253 BufPtr = new (&Buffer) TNorm(io, Obj);
1255 BufPtr = new (&Buffer) TNorm(io);
1260 if (!io.outputting()) {
1261 Result = BufPtr->denormalize(io);
1281 : io(i_o), Result(Obj) {
1282 if (io.outputting()) {
1283 BufPtr = new (&Buffer) TNorm(io, Obj);
1286 new (BufPtr) TNorm(io);
1288 BufPtr =
new TNorm(io);
1293 if (io.outputting()) {
1296 Result = BufPtr->denormalize(io);
1307 TNorm *BufPtr =
nullptr;
1330 void *DiagHandlerCtxt =
nullptr);
1333 void *DiagHandlerCtxt =
nullptr);
1337 std::error_code
error()
override;
1340 bool outputting()
const override;
1342 void beginMapping()
override;
1343 void endMapping()
override;
1344 bool preflightKey(
const char *,
bool,
bool,
bool &,
void *&)
override;
1345 void postflightKey(
void *)
override;
1346 std::vector<StringRef> keys()
override;
1347 void beginFlowMapping()
override;
1348 void endFlowMapping()
override;
1349 unsigned beginSequence()
override;
1350 void endSequence()
override;
1351 bool preflightElement(
unsigned index,
void *&)
override;
1352 void postflightElement(
void *)
override;
1353 unsigned beginFlowSequence()
override;
1354 bool preflightFlowElement(
unsigned,
void *&)
override;
1355 void postflightFlowElement(
void *)
override;
1356 void endFlowSequence()
override;
1357 void beginEnumScalar()
override;
1358 bool matchEnumScalar(
const char *,
bool)
override;
1359 bool matchEnumFallback()
override;
1360 void endEnumScalar()
override;
1361 bool beginBitSetScalar(
bool &)
override;
1362 bool bitSetMatch(
const char *,
bool)
override;
1363 void endBitSetScalar()
override;
1365 void blockScalarString(
StringRef &)
override;
1366 void scalarTag(std::string &)
override;
1368 void setError(
const Twine &message)
override;
1369 bool canElideEmptySequence()
override;
1373 HNode(
Node *n) : _node(n) {}
1375 static bool classof(
const HNode *) {
return true; }
1380 class EmptyHNode :
public HNode {
1382 EmptyHNode(
Node *n) : HNode(n) {}
1384 static bool classof(
const HNode *n) {
return NullNode::classof(n->_node); }
1386 static bool classof(
const EmptyHNode *) {
return true; }
1389 class ScalarHNode :
public HNode {
1391 ScalarHNode(Node *n, StringRef s) : HNode(n), _value(s) {}
1393 StringRef value()
const {
return _value; }
1395 static bool classof(
const HNode *n) {
1396 return ScalarNode::classof(n->_node) ||
1397 BlockScalarNode::classof(n->_node);
1400 static bool classof(
const ScalarHNode *) {
return true; }
1406 class MapHNode :
public HNode {
1408 MapHNode(Node *n) : HNode(n) {}
1410 static bool classof(
const HNode *n) {
1411 return MappingNode::classof(n->_node);
1414 static bool classof(
const MapHNode *) {
return true; }
1416 using NameToNodeAndLoc = StringMap<std::pair<HNode *, SMRange>>;
1418 NameToNodeAndLoc Mapping;
1419 SmallVector<std::string, 6> ValidKeys;
1422 class SequenceHNode :
public HNode {
1424 SequenceHNode(Node *n) : HNode(n) {}
1426 static bool classof(
const HNode *n) {
1427 return SequenceNode::classof(n->_node);
1430 static bool classof(
const SequenceHNode *) {
return true; }
1432 std::vector<HNode *> Entries;
1435 Input::HNode *createHNodes(Node *node);
1436 void setError(HNode *hnode,
const Twine &message);
1437 void setError(Node *node,
const Twine &message);
1438 void setError(
const SMRange &
Range,
const Twine &message);
1440 void reportWarning(HNode *hnode,
const Twine &message);
1441 void reportWarning(Node *hnode,
const Twine &message);
1442 void reportWarning(
const SMRange &
Range,
const Twine &message);
1445 void releaseHNodeBuffers();
1450 bool setCurrentDocument();
1451 bool nextDocument();
1454 const Node *getCurrentNode()
const;
1456 void setAllowUnknownKeys(
bool Allow)
override;
1460 std::unique_ptr<llvm::yaml::Stream> Strm;
1461 HNode *TopNode =
nullptr;
1464 SpecificBumpPtrAllocator<EmptyHNode> EmptyHNodeAllocator;
1465 SpecificBumpPtrAllocator<ScalarHNode> ScalarHNodeAllocator;
1466 SpecificBumpPtrAllocator<MapHNode> MapHNodeAllocator;
1467 SpecificBumpPtrAllocator<SequenceHNode> SequenceHNodeAllocator;
1468 document_iterator DocIterator;
1469 llvm::BitVector BitValuesUsed;
1470 HNode *CurrentNode =
nullptr;
1471 bool ScalarMatchFound =
false;
1472 bool AllowUnknownKeys =
false;
1491 bool outputting()
const override;
1493 void beginMapping()
override;
1494 void endMapping()
override;
1495 bool preflightKey(
const char *key,
bool,
bool,
bool &,
void *&)
override;
1496 void postflightKey(
void *)
override;
1497 std::vector<StringRef> keys()
override;
1498 void beginFlowMapping()
override;
1499 void endFlowMapping()
override;
1500 unsigned beginSequence()
override;
1501 void endSequence()
override;
1502 bool preflightElement(
unsigned,
void *&)
override;
1503 void postflightElement(
void *)
override;
1504 unsigned beginFlowSequence()
override;
1505 bool preflightFlowElement(
unsigned,
void *&)
override;
1506 void postflightFlowElement(
void *)
override;
1507 void endFlowSequence()
override;
1508 void beginEnumScalar()
override;
1509 bool matchEnumScalar(
const char *,
bool)
override;
1510 bool matchEnumFallback()
override;
1511 void endEnumScalar()
override;
1512 bool beginBitSetScalar(
bool &)
override;
1513 bool bitSetMatch(
const char *,
bool)
override;
1514 void endBitSetScalar()
override;
1516 void blockScalarString(
StringRef &)
override;
1517 void scalarTag(std::string &)
override;
1519 void setError(
const Twine &message)
override;
1520 std::error_code
error()
override;
1521 bool canElideEmptySequence()
override;
1525 void beginDocuments();
1526 bool preflightDocument(
unsigned);
1527 void postflightDocument();
1528 void endDocuments();
1534 void newLineCheck(
bool EmptySequence =
false);
1535 void outputNewLine();
1542 inFlowSeqFirstElement,
1543 inFlowSeqOtherElement,
1550 static bool inSeqAnyElement(InState State);
1551 static bool inFlowSeqAnyElement(InState State);
1552 static bool inMapAnyKey(InState State);
1553 static bool inFlowMapAnyKey(InState State);
1559 int ColumnAtFlowStart = 0;
1560 int ColumnAtMapFlowStart = 0;
1561 bool NeedBitValueComma =
false;
1562 bool NeedFlowSequenceComma =
false;
1563 bool EnumerationMatchFound =
false;
1564 bool WriteDefaultValues =
false;
1569template <
typename T,
typename Context>
1570void IO::processKeyWithDefault(
const char *
Key, std::optional<T> &Val,
1571 const std::optional<T> &DefaultValue,
1573 assert(!DefaultValue &&
"std::optional<T> shouldn't have a value!");
1575 bool UseDefault =
true;
1576 const bool sameAsDefault =
outputting() && !Val;
1586 bool IsNone =
false;
1588 if (
const auto *
Node =
1592 IsNone =
Node->getRawValue().rtrim(
' ') ==
"<none>";
1613#define LLVM_YAML_STRONG_TYPEDEF(_base, _type) \
1615 _type() = default; \
1616 _type(const _base v) : value(v) {} \
1617 _type(const _type &v) = default; \
1618 _type &operator=(const _type &rhs) = default; \
1619 _type &operator=(const _base &rhs) { \
1623 operator const _base &() const { return value; } \
1624 bool operator==(const _type &rhs) const { return value == rhs.value; } \
1625 bool operator==(const _base &rhs) const { return value == rhs; } \
1626 bool operator<(const _type &rhs) const { return value < rhs.value; } \
1628 using BaseType = _base; \
1672template <
typename T>
1673inline std::enable_if_t<has_DocumentListTraits<T>::value,
Input &>
1688template <
typename T>
1689inline std::enable_if_t<has_MappingTraits<T, EmptyContext>::value,
Input &>
1693 yamlize(yin, docMap,
true, Ctx);
1699template <
typename T>
1700inline std::enable_if_t<has_SequenceTraits<T>::value,
Input &>
1704 yamlize(yin, docSeq,
true, Ctx);
1709template <
typename T>
1710inline std::enable_if_t<has_BlockScalarTraits<T>::value,
Input &>
1713 if (In.setCurrentDocument())
1719template <
typename T>
1720inline std::enable_if_t<has_CustomMappingTraits<T>::value,
Input &>
1723 if (In.setCurrentDocument())
1729template <
typename T>
1730inline std::enable_if_t<has_PolymorphicTraits<T>::value,
Input &>
1733 if (In.setCurrentDocument())
1739template <
typename T>
1740inline std::enable_if_t<missingTraits<T, EmptyContext>::value,
Input &>
1747template <
typename T>
1748inline std::enable_if_t<has_DocumentListTraits<T>::value, Output &>
1751 yout.beginDocuments();
1752 const size_t count = DocumentListTraits<T>::size(yout, docList);
1753 for (
size_t i = 0; i <
count; ++i) {
1754 if (yout.preflightDocument(i)) {
1755 yamlize(yout, DocumentListTraits<T>::element(yout, docList, i),
true,
1757 yout.postflightDocument();
1760 yout.endDocuments();
1765template <
typename T>
1766inline std::enable_if_t<has_MappingTraits<T, EmptyContext>::value,
Output &>
1769 yout.beginDocuments();
1770 if (yout.preflightDocument(0)) {
1771 yamlize(yout, map,
true, Ctx);
1772 yout.postflightDocument();
1774 yout.endDocuments();
1779template <
typename T>
1780inline std::enable_if_t<has_SequenceTraits<T>::value,
Output &>
1783 yout.beginDocuments();
1784 if (yout.preflightDocument(0)) {
1786 yout.postflightDocument();
1788 yout.endDocuments();
1793template <
typename T>
1794inline std::enable_if_t<has_BlockScalarTraits<T>::value,
Output &>
1797 Out.beginDocuments();
1798 if (Out.preflightDocument(0)) {
1800 Out.postflightDocument();
1807template <
typename T>
1808inline std::enable_if_t<has_CustomMappingTraits<T>::value,
Output &>
1811 Out.beginDocuments();
1812 if (Out.preflightDocument(0)) {
1814 Out.postflightDocument();
1822template <
typename T>
1823inline std::enable_if_t<has_PolymorphicTraits<T>::value,
Output &>
1826 Out.beginDocuments();
1827 if (Out.preflightDocument(0)) {
1831 "plain scalar documents are not supported");
1833 Out.postflightDocument();
1840template <
typename T>
1841inline std::enable_if_t<missingTraits<T, EmptyContext>::value,
Output &>
1852template <
typename T>
1856 using type =
typename T::value_type;
1860 if (index >=
seq.size())
1861 seq.resize(index + 1);
1863 if (index >=
seq.size()) {
1864 io.
setError(
Twine(
"value sequence extends beyond static size (") +
1873template <
typename T,
bool Flow>
1886template <
typename T>
1889 std::enable_if_t<CheckIsBool<SequenceElementTraits<T>::flow>::value>>
1891template <
typename T,
size_t N>
1894 std::enable_if_t<CheckIsBool<SequenceElementTraits<T>::flow>::value>>
1896template <
typename T,
unsigned N>
1899 std::enable_if_t<CheckIsBool<SequenceElementTraits<T>::flow>::value>>
1901template <
typename T>
1904 std::enable_if_t<CheckIsBool<SequenceElementTraits<T>::flow>::value>>
1906template <
typename T>
1909 std::enable_if_t<CheckIsBool<SequenceElementTraits<T>::flow>::value>>
1913template <
typename T>
1946#define LLVM_YAML_IS_SEQUENCE_VECTOR_IMPL(TYPE, FLOW) \
1950 !std::is_fundamental_v<TYPE> && !std::is_same_v<TYPE, std::string> && \
1951 !std::is_same_v<TYPE, llvm::StringRef>, \
1952 "only use LLVM_YAML_IS_SEQUENCE_VECTOR for types you control"); \
1953 template <> struct SequenceElementTraits<TYPE> { \
1954 static const bool flow = FLOW; \
1961#define LLVM_YAML_IS_SEQUENCE_VECTOR(type) \
1962 LLVM_YAML_IS_SEQUENCE_VECTOR_IMPL(type, false)
1966#define LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(type) \
1967 LLVM_YAML_IS_SEQUENCE_VECTOR_IMPL(type, true)
1969#define LLVM_YAML_DECLARE_MAPPING_TRAITS(Type) \
1972 template <> struct LLVM_ABI MappingTraits<Type> { \
1973 static void mapping(IO &IO, Type &Obj); \
1978#define LLVM_YAML_DECLARE_MAPPING_TRAITS_PRIVATE(Type) \
1981 template <> struct MappingTraits<Type> { \
1982 static void mapping(IO &IO, Type &Obj); \
1987#define LLVM_YAML_DECLARE_ENUM_TRAITS(Type) \
1990 template <> struct LLVM_ABI ScalarEnumerationTraits<Type> { \
1991 static void enumeration(IO &io, Type &Value); \
1996#define LLVM_YAML_DECLARE_BITSET_TRAITS(Type) \
1999 template <> struct LLVM_ABI ScalarBitSetTraits<Type> { \
2000 static void bitset(IO &IO, Type &Options); \
2005#define LLVM_YAML_DECLARE_SCALAR_TRAITS(Type, MustQuote) \
2008 template <> struct LLVM_ABI ScalarTraits<Type> { \
2009 static void output(const Type &Value, void *ctx, raw_ostream &Out); \
2010 static StringRef input(StringRef Scalar, void *ctxt, Type &Value); \
2011 static QuotingType mustQuote(StringRef) { return MustQuote; } \
2018#define LLVM_YAML_IS_DOCUMENT_LIST_VECTOR(_type) \
2021 template <unsigned N> \
2022 struct DocumentListTraits<SmallVector<_type, N>> \
2023 : public SequenceTraitsImpl<SmallVector<_type, N>, false> {}; \
2025 struct DocumentListTraits<std::vector<_type>> \
2026 : public SequenceTraitsImpl<std::vector<_type>, false> {}; \
2032#define LLVM_YAML_IS_STRING_MAP(_type) \
2036 struct CustomMappingTraits<std::map<std::string, _type>> \
2037 : public StdMapStringCustomMappingTraitsImpl<_type> {}; \
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file defines the StringMap class.
This file defines the BumpPtrAllocator interface.
This file implements the BitVector class.
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
This file defines the SmallVector class.
static void DiagHandler(const SMDiagnostic &Diag, void *Context)
#define LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(type)
Utility for declaring that a std::vector of a particular type should be considered a YAML flow sequen...
#define LLVM_YAML_STRONG_TYPEDEF(_base, _type)
YAML I/O does conversion based on types. But often native data types are just a typedef of built in i...
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
void(*)(const SMDiagnostic &, void *Context) DiagHandlerTy
Clients that want to handle their own diagnostics in a custom way can register a function pointer+con...
StringRef - Represent a constant reference to a string, i.e.
std::string str() const
str - Get the contents as an std::string.
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
constexpr bool empty() const
empty - Check if the string is empty.
StringRef drop_front(size_t N=1) const
Return a StringRef equal to 'this' but with the first N elements dropped.
char back() const
back - Get the last character in the string.
constexpr size_t size() const
size - Get the string size.
char front() const
front - Get the first character in the string.
static constexpr size_t npos
LLVM_ABI size_t find_first_not_of(char C, size_t From=0) const
Find the first character in the string that is not C or npos if not found.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
LLVM Value Representation.
Represents a version number in the form major[.minor[.subminor[.build]]].
This class implements an extremely fast bulk output stream that can only output to a stream.
A raw_ostream that writes to an std::string.
A raw_ostream that writes to an SmallVector or SmallString.
StringRef str() const
Return a StringRef for the vector contents.
virtual bool canElideEmptySequence()=0
virtual void postflightFlowElement(void *)=0
virtual NodeKind getNodeKind()=0
void maskedBitSetCase(T &Val, const char *Str, T ConstVal, T Mask)
virtual void endSequence()=0
void bitSetCase(T &Val, const char *Str, const uint32_t ConstVal)
void mapOptional(const char *Key, T &Val)
virtual void endEnumScalar()=0
void bitSetCase(T &Val, const char *Str, const T ConstVal)
virtual bool outputting() const =0
virtual unsigned beginFlowSequence()=0
virtual bool mapTag(StringRef Tag, bool Default=false)=0
void mapRequired(const char *Key, T &Val, Context &Ctx)
virtual void endFlowSequence()=0
virtual void beginMapping()=0
virtual void setAllowUnknownKeys(bool Allow)
void maskedBitSetCase(T &Val, const char *Str, uint32_t ConstVal, uint32_t Mask)
virtual void endMapping()=0
virtual bool preflightElement(unsigned, void *&)=0
virtual unsigned beginSequence()=0
void mapRequired(const char *Key, T &Val)
virtual void beginEnumScalar()=0
virtual bool matchEnumScalar(const char *, bool)=0
virtual std::error_code error()=0
virtual void scalarString(StringRef &, QuotingType)=0
virtual void setError(const Twine &)=0
virtual bool bitSetMatch(const char *, bool)=0
void * getContext() const
void enumCase(T &Val, const char *Str, const uint32_t ConstVal)
void mapOptionalWithContext(const char *Key, T &Val, Context &Ctx)
virtual void postflightElement(void *)=0
virtual void postflightKey(void *)=0
virtual void endFlowMapping()=0
virtual bool preflightKey(const char *, bool, bool, bool &, void *&)=0
void enumFallback(T &Val)
virtual void beginFlowMapping()=0
virtual bool beginBitSetScalar(bool &)=0
virtual void blockScalarString(StringRef &)=0
virtual void scalarTag(std::string &)=0
virtual bool matchEnumFallback()=0
void enumCase(T &Val, const char *Str, const T ConstVal)
virtual bool preflightFlowElement(unsigned, void *&)=0
virtual void endBitSetScalar()=0
void mapOptionalWithContext(const char *Key, std::optional< T > &Val, Context &Ctx)
void mapOptional(const char *Key, T &Val, const DefaultT &Default)
virtual std::vector< StringRef > keys()=0
void mapOptionalWithContext(const char *Key, T &Val, const DefaultT &Default, Context &Ctx)
Abstract base class for all Nodes.
The Output class is used to generate a yaml document from in-memory structs and vectors.
Output(raw_ostream &, void *Ctxt=nullptr, int WrapColumn=70)
void setWriteDefaultValues(bool Write)
Set whether or not to output optional values which are equal to the default value....
This class represents a YAML stream potentially containing multiple documents.
static constexpr bool value
@ Tail
Attemps to make calls as fast as possible while guaranteeing that tail call optimization can always b...
@ C
The default llvm calling convention, compatible with C.
NodeAddr< NodeBase * > Node
void doMapping(IO &io, T &Val, Context &Ctx)
std::string doValidate(IO &io, T &Val, Context &Ctx)
QuotingType
Describe which type of quotes should be used when quoting is necessary.
std::enable_if_t< has_ScalarEnumerationTraits< T >::value, void > yamlize(IO &io, T &Val, bool, EmptyContext &Ctx)
decltype(std::declval< T >().resize(0)) check_resize_t
bool isNumeric(StringRef S)
std::enable_if_t< has_DocumentListTraits< T >::value, Input & > operator>>(Input &yin, T &docList)
QuotingType needsQuotes(StringRef S, bool ForcePreserveAsString=true)
bool yamlizeMappingEnumInput(IO &io, T &Val)
std::enable_if_t< has_DocumentListTraits< T >::value, Output & > operator<<(Output &yout, T &docList)
This is an optimization pass for GlobalISel generic memory operations.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
bool isAlnum(char C)
Checks whether character C is either a decimal digit or an uppercase or lowercase letter as classifie...
BumpPtrAllocatorImpl BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
auto count(R &&Range, const E &Element)
Wrapper function around std::count to count the number of times an element Element occurs in the give...
typename detail::detector< void, Op, Args... >::value_t is_detected
Detects if a given trait holds for some set of arguments 'Args'.
bool isSpace(char C)
Checks whether character C is whitespace in the "C" locale.
auto seq(T Begin, T End)
Iterate over an integral type from Begin up to - but not including - End.
@ Default
The result values are uniform if and only if all operands are uniform.
Implement std::hash so that hash_code can be used in STL containers.
A suitably aligned and sized character array member which can hold elements of any type.
This class should be specialized by type that requires custom conversion to/from a YAML literal block...
This class should be specialized by any type that needs to be converted to/from a YAML mapping in the...
This class should be specialized by any type that needs to be converted to/from a list of YAML docume...
typename T::value_type type
static type & element(IO &io, T &seq, size_t index)
This class is similar to MappingTraits<T> but allows you to pass in additional context for each map o...
~MappingNormalizationHeap()
MappingNormalizationHeap(IO &i_o, TFinal &Obj, BumpPtrAllocator *allocator)
MappingNormalization(IO &i_o, TFinal &Obj)
This class should be specialized by any type that needs to be converted to/from a YAML mapping.
This class should be specialized by any type that can be represented as a scalar, map,...
support::detail::packed_endian_specific_integral< value_type, endian, alignment > endian_type
static void bitset(IO &io, endian_type &E)
This class should be specialized by any integer type that is a union of bit values and the YAML repre...
support::detail::packed_endian_specific_integral< value_type, endian, alignment > endian_type
static void enumeration(IO &io, endian_type &E)
This class should be specialized by any integral type that converts to/from a YAML scalar where there...
static QuotingType mustQuote(StringRef)
static LLVM_ABI void output(const Hex16 &, void *, raw_ostream &)
static LLVM_ABI StringRef input(StringRef, void *, Hex16 &)
static QuotingType mustQuote(StringRef)
static LLVM_ABI void output(const Hex32 &, void *, raw_ostream &)
static LLVM_ABI StringRef input(StringRef, void *, Hex32 &)
static LLVM_ABI StringRef input(StringRef, void *, Hex64 &)
static LLVM_ABI void output(const Hex64 &, void *, raw_ostream &)
static QuotingType mustQuote(StringRef)
static LLVM_ABI StringRef input(StringRef, void *, Hex8 &)
static QuotingType mustQuote(StringRef)
static LLVM_ABI void output(const Hex8 &, void *, raw_ostream &)
static LLVM_ABI StringRef input(StringRef, void *, StringRef &)
static LLVM_ABI void output(const StringRef &, void *, raw_ostream &)
static QuotingType mustQuote(StringRef S)
static LLVM_ABI void output(const VersionTuple &Value, void *, llvm::raw_ostream &Out)
static QuotingType mustQuote(StringRef)
static LLVM_ABI StringRef input(StringRef, void *, VersionTuple &)
static LLVM_ABI void output(const bool &, void *, raw_ostream &)
static QuotingType mustQuote(StringRef)
static LLVM_ABI StringRef input(StringRef, void *, bool &)
static QuotingType mustQuote(StringRef)
static LLVM_ABI StringRef input(StringRef, void *, double &)
static LLVM_ABI void output(const double &, void *, raw_ostream &)
static QuotingType mustQuote(StringRef)
static LLVM_ABI StringRef input(StringRef, void *, float &)
static LLVM_ABI void output(const float &, void *, raw_ostream &)
static LLVM_ABI void output(const int16_t &, void *, raw_ostream &)
static LLVM_ABI StringRef input(StringRef, void *, int16_t &)
static QuotingType mustQuote(StringRef)
static LLVM_ABI void output(const int32_t &, void *, raw_ostream &)
static LLVM_ABI StringRef input(StringRef, void *, int32_t &)
static QuotingType mustQuote(StringRef)
static LLVM_ABI StringRef input(StringRef, void *, int64_t &)
static QuotingType mustQuote(StringRef)
static LLVM_ABI void output(const int64_t &, void *, raw_ostream &)
static LLVM_ABI void output(const int8_t &, void *, raw_ostream &)
static LLVM_ABI StringRef input(StringRef, void *, int8_t &)
static QuotingType mustQuote(StringRef)
static LLVM_ABI void output(const std::string &, void *, raw_ostream &)
static QuotingType mustQuote(StringRef S)
static LLVM_ABI StringRef input(StringRef, void *, std::string &)
support::detail::packed_endian_specific_integral< value_type, endian, alignment > endian_type
static StringRef input(StringRef Str, void *Ctx, endian_type &E)
static void output(const endian_type &E, void *Ctx, raw_ostream &Stream)
static QuotingType mustQuote(StringRef Str)
static LLVM_ABI void output(const uint16_t &, void *, raw_ostream &)
static QuotingType mustQuote(StringRef)
static LLVM_ABI StringRef input(StringRef, void *, uint16_t &)
static QuotingType mustQuote(StringRef)
static LLVM_ABI StringRef input(StringRef, void *, uint32_t &)
static LLVM_ABI void output(const uint32_t &, void *, raw_ostream &)
static LLVM_ABI void output(const uint64_t &, void *, raw_ostream &)
static LLVM_ABI StringRef input(StringRef, void *, uint64_t &)
static QuotingType mustQuote(StringRef)
static LLVM_ABI void output(const uint8_t &, void *, raw_ostream &)
static QuotingType mustQuote(StringRef)
static LLVM_ABI StringRef input(StringRef, void *, uint8_t &)
This class should be specialized by type that requires custom conversion to/from a yaml scalar.
This class should be specialized by any type for which vectors of that type need to be converted to/f...
static size_t size(IO &io, T &seq)
This class should be specialized by any type that needs to be converted to/from a YAML sequence.
Implementation of CustomMappingTraits for std::map<std::string, T>.
static void inputOne(IO &io, StringRef key, map_type &v)
std::map< std::string, T > map_type
static void output(IO &io, map_type &v)
This class should be specialized by type that requires custom conversion to/from a YAML scalar with o...
StringRef(*)(StringRef, void *, T &) SignatureInput
static constexpr bool value
void(*)(const T &, void *, raw_ostream &) SignatureOutput
std::tuple< SameType< SignatureInput, &U::input >, SameType< SignatureOutput, &U::output > > check
SameType< SignatureInput, &U::inputOne > check
static constexpr bool value
void(*)(IO &io, StringRef key, T &v) SignatureInput
static constexpr bool value
size_t(*)(class IO &, T &) SignatureSize
SameType< SignatureSize, &U::size > check
static constexpr bool value
static constexpr bool value
SameType< SignatureEnumInput, &U::enumInput > check
void(*)(class IO &, T &) SignatureEnumInput
SameType< SignatureMapping, &U::mapping > check
void(*)(class IO &, T &) SignatureMapping
static constexpr bool value
void(*)(class IO &, T &, Context &) SignatureMapping
SameType< SignatureMapping, &U::mapping > check
static constexpr bool value
SameType< SignatureValidate, &U::validate > check
static constexpr bool value
std::string(*)(class IO &, T &) SignatureValidate
std::string(*)(class IO &, T &, Context &) SignatureValidate
static constexpr bool value
SameType< SignatureValidate, &U::validate > check
NodeKind(*)(const T &) SignatureGetKind
static constexpr bool value
SameType< SignatureGetKind, &U::getKind > check
void(*)(class IO &, T &) SignatureBitset
static constexpr bool value
SameType< SignatureBitset, &ScalarBitSetTraits< U >::bitset > check
void(*)(class IO &, T &) SignatureEnumeration
SameType< SignatureEnumeration, &ScalarEnumerationTraits< U >::enumeration > check
static constexpr bool value
void(*)(const T &, void *, raw_ostream &) SignatureOutput
QuotingType(*)(StringRef) SignatureMustQuote
std::tuple< SameType< SignatureInput, &U::input >, SameType< SignatureOutput, &U::output >, SameType< SignatureMustQuote, &U::mustQuote > > check
StringRef(*)(StringRef, void *, T &) SignatureInput
static constexpr bool value
static constexpr bool value
size_t(*)(class IO &, T &) SignatureSize
SameType< SignatureSize, &U::size > check
StringRef(*)(StringRef, StringRef, void *, T &) SignatureInput
QuotingType(*)(const T &, StringRef) SignatureMustQuote
std::tuple< SameType< SignatureInput, &U::input >, SameType< SignatureOutput, &U::output >, SameType< SignatureMustQuote, &U::mustQuote > > check
void(*)(const T &, void *, raw_ostream &, raw_ostream &) SignatureOutput
static constexpr bool value