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>,
447 template <
class U>
using check =
decltype(&U::flow);
455 :
public std::bool_constant<has_SequenceMethodTraits<T>::value> {};
477 return Input.ltrim(
"0123456789");
482 if (S.
empty() || S ==
"+" || S ==
"-")
485 if (S ==
".nan" || S ==
".NaN" || S ==
".NAN")
500 return S.
size() > 2 &&
515 (S.
size() > 1 && std::strchr(
"0123456789", S[1]) ==
nullptr)))
534 if (S.
front() ==
'.') {
537 }
else if (S.
front() ==
'e' || S.
front() ==
'E') {
538 State = FoundExponent;
544 if (State == FoundDot) {
550 State = FoundExponent;
557 assert(State == FoundExponent &&
"Should have found exponent at this point.");
567 return skipDigits(S).empty();
571 return S ==
"null" || S ==
"Null" || S ==
"NULL" || S ==
"~";
576 return S ==
"true" || S ==
"True" || S ==
"TRUE" || S ==
"false" ||
577 S ==
"False" || S ==
"FALSE";
597 if (ForcePreserveAsString) {
609 if (std::strchr(R
"(-?:\,[]{}#&*!|>'"%@`)", S[0]) != nullptr)
612 for (
unsigned char C : S) {
659 return MaxQuotingNeeded;
662template <
typename T,
typename Context>
664 :
public std::bool_constant<
665 !has_ScalarEnumerationTraits<T>::value &&
666 !has_ScalarBitSetTraits<T>::value && !has_ScalarTraits<T>::value &&
667 !has_BlockScalarTraits<T>::value &&
668 !has_TaggedScalarTraits<T>::value &&
669 !has_MappingTraits<T, Context>::value &&
670 !has_SequenceTraits<T>::value && !has_CustomMappingTraits<T>::value &&
671 !has_DocumentListTraits<T>::value &&
672 !has_PolymorphicTraits<T>::value> {};
674template <
typename T,
typename Context>
676 :
public std::bool_constant<has_MappingTraits<T, Context>::value &&
677 has_MappingValidateTraits<T, Context>::value> {
680template <
typename T,
typename Context>
682 :
public std::bool_constant<has_MappingTraits<T, Context>::value &&
683 !has_MappingValidateTraits<T, Context>::value> {
689 IO(
void *Ctxt =
nullptr);
708 virtual bool preflightKey(
const char *,
bool,
bool,
bool &,
void *&) = 0;
710 virtual std::vector<StringRef>
keys() = 0;
731 virtual std::error_code
error() = 0;
734 template <
typename T>
742 template <
typename T>
753 FBT Res =
static_cast<typename FBT::BaseType
>(Val);
754 yamlize(*
this, Res,
true, Context);
755 Val =
static_cast<T>(
static_cast<typename FBT::BaseType
>(Res));
759 template <
typename T>
762 Val =
static_cast<T>(Val | ConstVal);
767 template <
typename T>
770 Val =
static_cast<T>(Val | ConstVal);
774 template <
typename T>
777 Val = Val | ConstVal;
780 template <
typename T>
784 Val = Val | ConstVal;
787 void *getContext()
const;
788 void setContext(
void *);
792 this->processKey(
Key, Val,
true, Ctx);
795 template <
typename T,
typename Context>
797 this->processKey(
Key, Val,
true, Ctx);
805 template <
typename T,
typename DefaultT>
811 template <
typename T,
typename Context>
818 this->processKey(
Key, Val,
false, Ctx);
821 template <
typename T,
typename Context>
824 this->processKeyWithDefault(
Key, Val, std::optional<T>(),
828 template <
typename T,
typename Context,
typename DefaultT>
831 static_assert(std::is_convertible<DefaultT, T>::value,
832 "Default type must be implicitly convertible to value type!");
833 this->processKeyWithDefault(
Key, Val,
static_cast<const T &
>(
Default),
838 template <
typename T,
typename Context>
839 void processKeyWithDefault(
const char *
Key, std::optional<T> &Val,
840 const std::optional<T> &DefaultValue,
843 template <
typename T,
typename Context>
844 void processKeyWithDefault(
const char *
Key,
T &Val,
const T &DefaultValue,
848 const bool sameAsDefault = outputting() && Val == DefaultValue;
849 if (this->preflightKey(
Key,
Required, sameAsDefault, UseDefault,
852 this->postflightKey(SaveInfo);
859 template <
typename T,
typename Context>
860 void processKey(
const char *Key,
T &Val,
bool Required,
Context &Ctx) {
863 if (this->preflightKey(Key, Required,
false, UseDefault, SaveInfo)) {
864 yamlize(*
this, Val, Required, Ctx);
865 this->postflightKey(SaveInfo);
875template <
typename T,
typename Context>
887std::enable_if_t<has_ScalarEnumerationTraits<T>::value,
void>
895std::enable_if_t<has_ScalarBitSetTraits<T>::value,
void>
907std::enable_if_t<has_ScalarTraits<T>::value,
void>
yamlize(
IO &io,
T &Val,
bool,
919 if (!Result.empty()) {
926std::enable_if_t<has_BlockScalarTraits<T>::value,
void>
945std::enable_if_t<has_TaggedScalarTraits<T>::value,
void>
948 std::string ScalarStorage, TagStorage;
963 if (!Result.empty()) {
971template <
typename T,
typename Context>
982template <
typename T,
typename Context>
983std::enable_if_t<validatedMappingTraits<T, Context>::value,
void>
992 errs() << Err <<
"\n";
993 assert(Err.empty() &&
"invalid struct trying to be written as yaml");
1008template <
typename T,
typename Context>
1023template <
typename T,
typename Context>
1024std::enable_if_t<unvalidatedMappingTraits<T, Context>::value,
void>
1039template <
typename T>
1040std::enable_if_t<has_CustomMappingTraits<T>::value,
void>
1054template <
typename T>
1055std::enable_if_t<has_PolymorphicTraits<T>::value,
void>
1068template <
typename T>
1069std::enable_if_t<missingTraits<T, EmptyContext>::value,
void>
1074template <
typename T,
typename Context>
1075std::enable_if_t<has_SequenceTraits<T>::value,
void>
1080 for (
unsigned i = 0; i <
count; ++i) {
1091 for (
unsigned i = 0; i <
count; ++i) {
1183template <
typename value_type, llvm::endianness endian,
size_t alignment>
1185 value_type, endian, alignment>,
1186 std::enable_if_t<has_ScalarTraits<value_type>::value>> {
1207template <
typename value_type, llvm::endianness endian,
size_t alignment>
1209 support::detail::packed_endian_specific_integral<value_type, endian,
1211 std::enable_if_t<has_ScalarEnumerationTraits<value_type>::value>> {
1223template <
typename value_type, llvm::endianness endian,
size_t alignment>
1225 support::detail::packed_endian_specific_integral<value_type, endian,
1227 std::enable_if_t<has_ScalarBitSetTraits<value_type>::value>> {
1242 : io(i_o), BufPtr(nullptr), Result(Obj) {
1243 if (io.outputting()) {
1244 BufPtr = new (&Buffer) TNorm(io, Obj);
1246 BufPtr = new (&Buffer) TNorm(io);
1251 if (!io.outputting()) {
1252 Result = BufPtr->denormalize(io);
1272 : io(i_o), Result(Obj) {
1273 if (io.outputting()) {
1274 BufPtr = new (&Buffer) TNorm(io, Obj);
1277 new (BufPtr) TNorm(io);
1279 BufPtr =
new TNorm(io);
1284 if (io.outputting()) {
1287 Result = BufPtr->denormalize(io);
1298 TNorm *BufPtr =
nullptr;
1321 void *DiagHandlerCtxt =
nullptr);
1324 void *DiagHandlerCtxt =
nullptr);
1328 std::error_code
error()
override;
1331 bool outputting()
const override;
1333 void beginMapping()
override;
1334 void endMapping()
override;
1335 bool preflightKey(
const char *,
bool,
bool,
bool &,
void *&)
override;
1336 void postflightKey(
void *)
override;
1337 std::vector<StringRef> keys()
override;
1338 void beginFlowMapping()
override;
1339 void endFlowMapping()
override;
1340 unsigned beginSequence()
override;
1341 void endSequence()
override;
1342 bool preflightElement(
unsigned index,
void *&)
override;
1343 void postflightElement(
void *)
override;
1344 unsigned beginFlowSequence()
override;
1345 bool preflightFlowElement(
unsigned,
void *&)
override;
1346 void postflightFlowElement(
void *)
override;
1347 void endFlowSequence()
override;
1348 void beginEnumScalar()
override;
1349 bool matchEnumScalar(
const char *,
bool)
override;
1350 bool matchEnumFallback()
override;
1351 void endEnumScalar()
override;
1352 bool beginBitSetScalar(
bool &)
override;
1353 bool bitSetMatch(
const char *,
bool)
override;
1354 void endBitSetScalar()
override;
1356 void blockScalarString(
StringRef &)
override;
1357 void scalarTag(std::string &)
override;
1359 void setError(
const Twine &message)
override;
1360 bool canElideEmptySequence()
override;
1364 HNode(
Node *n) : _node(n) {}
1366 static bool classof(
const HNode *) {
return true; }
1371 class EmptyHNode :
public HNode {
1373 EmptyHNode(
Node *n) : HNode(n) {}
1375 static bool classof(
const HNode *n) {
return NullNode::classof(n->_node); }
1377 static bool classof(
const EmptyHNode *) {
return true; }
1380 class ScalarHNode :
public HNode {
1382 ScalarHNode(Node *n, StringRef s) : HNode(n), _value(s) {}
1384 StringRef value()
const {
return _value; }
1386 static bool classof(
const HNode *n) {
1387 return ScalarNode::classof(n->_node) ||
1388 BlockScalarNode::classof(n->_node);
1391 static bool classof(
const ScalarHNode *) {
return true; }
1397 class MapHNode :
public HNode {
1399 MapHNode(Node *n) : HNode(n) {}
1401 static bool classof(
const HNode *n) {
1402 return MappingNode::classof(n->_node);
1405 static bool classof(
const MapHNode *) {
return true; }
1407 using NameToNodeAndLoc = StringMap<std::pair<HNode *, SMRange>>;
1409 NameToNodeAndLoc Mapping;
1410 SmallVector<std::string, 6> ValidKeys;
1413 class SequenceHNode :
public HNode {
1415 SequenceHNode(Node *n) : HNode(n) {}
1417 static bool classof(
const HNode *n) {
1418 return SequenceNode::classof(n->_node);
1421 static bool classof(
const SequenceHNode *) {
return true; }
1423 std::vector<HNode *> Entries;
1426 Input::HNode *createHNodes(Node *node);
1427 void setError(HNode *hnode,
const Twine &message);
1428 void setError(Node *node,
const Twine &message);
1429 void setError(
const SMRange &
Range,
const Twine &message);
1431 void reportWarning(HNode *hnode,
const Twine &message);
1432 void reportWarning(Node *hnode,
const Twine &message);
1433 void reportWarning(
const SMRange &
Range,
const Twine &message);
1436 void releaseHNodeBuffers();
1441 bool setCurrentDocument();
1442 bool nextDocument();
1445 const Node *getCurrentNode()
const;
1447 void setAllowUnknownKeys(
bool Allow)
override;
1451 std::unique_ptr<llvm::yaml::Stream> Strm;
1452 HNode *TopNode =
nullptr;
1455 SpecificBumpPtrAllocator<EmptyHNode> EmptyHNodeAllocator;
1456 SpecificBumpPtrAllocator<ScalarHNode> ScalarHNodeAllocator;
1457 SpecificBumpPtrAllocator<MapHNode> MapHNodeAllocator;
1458 SpecificBumpPtrAllocator<SequenceHNode> SequenceHNodeAllocator;
1459 document_iterator DocIterator;
1460 llvm::BitVector BitValuesUsed;
1461 HNode *CurrentNode =
nullptr;
1462 bool ScalarMatchFound =
false;
1463 bool AllowUnknownKeys =
false;
1482 bool outputting()
const override;
1484 void beginMapping()
override;
1485 void endMapping()
override;
1486 bool preflightKey(
const char *key,
bool,
bool,
bool &,
void *&)
override;
1487 void postflightKey(
void *)
override;
1488 std::vector<StringRef> keys()
override;
1489 void beginFlowMapping()
override;
1490 void endFlowMapping()
override;
1491 unsigned beginSequence()
override;
1492 void endSequence()
override;
1493 bool preflightElement(
unsigned,
void *&)
override;
1494 void postflightElement(
void *)
override;
1495 unsigned beginFlowSequence()
override;
1496 bool preflightFlowElement(
unsigned,
void *&)
override;
1497 void postflightFlowElement(
void *)
override;
1498 void endFlowSequence()
override;
1499 void beginEnumScalar()
override;
1500 bool matchEnumScalar(
const char *,
bool)
override;
1501 bool matchEnumFallback()
override;
1502 void endEnumScalar()
override;
1503 bool beginBitSetScalar(
bool &)
override;
1504 bool bitSetMatch(
const char *,
bool)
override;
1505 void endBitSetScalar()
override;
1507 void blockScalarString(
StringRef &)
override;
1508 void scalarTag(std::string &)
override;
1510 void setError(
const Twine &message)
override;
1511 std::error_code
error()
override;
1512 bool canElideEmptySequence()
override;
1516 void beginDocuments();
1517 bool preflightDocument(
unsigned);
1518 void postflightDocument();
1519 void endDocuments();
1525 void newLineCheck(
bool EmptySequence =
false);
1526 void outputNewLine();
1533 inFlowSeqFirstElement,
1534 inFlowSeqOtherElement,
1541 static bool inSeqAnyElement(InState State);
1542 static bool inFlowSeqAnyElement(InState State);
1543 static bool inMapAnyKey(InState State);
1544 static bool inFlowMapAnyKey(InState State);
1550 int ColumnAtFlowStart = 0;
1551 int ColumnAtMapFlowStart = 0;
1552 bool NeedBitValueComma =
false;
1553 bool NeedFlowSequenceComma =
false;
1554 bool EnumerationMatchFound =
false;
1555 bool WriteDefaultValues =
false;
1560template <
typename T,
typename Context>
1561void IO::processKeyWithDefault(
const char *
Key, std::optional<T> &Val,
1562 const std::optional<T> &DefaultValue,
1564 assert(!DefaultValue &&
"std::optional<T> shouldn't have a value!");
1566 bool UseDefault =
true;
1567 const bool sameAsDefault =
outputting() && !Val;
1577 bool IsNone =
false;
1579 if (
const auto *
Node =
1583 IsNone =
Node->getRawValue().rtrim(
' ') ==
"<none>";
1604#define LLVM_YAML_STRONG_TYPEDEF(_base, _type) \
1606 _type() = default; \
1607 _type(const _base v) : value(v) {} \
1608 _type(const _type &v) = default; \
1609 _type &operator=(const _type &rhs) = default; \
1610 _type &operator=(const _base &rhs) { \
1614 operator const _base &() const { return value; } \
1615 bool operator==(const _type &rhs) const { return value == rhs.value; } \
1616 bool operator==(const _base &rhs) const { return value == rhs; } \
1617 bool operator<(const _type &rhs) const { return value < rhs.value; } \
1619 using BaseType = _base; \
1663template <
typename T>
1664inline std::enable_if_t<has_DocumentListTraits<T>::value,
Input &>
1679template <
typename T>
1680inline std::enable_if_t<has_MappingTraits<T, EmptyContext>::value,
Input &>
1684 yamlize(yin, docMap,
true, Ctx);
1690template <
typename T>
1691inline std::enable_if_t<has_SequenceTraits<T>::value,
Input &>
1695 yamlize(yin, docSeq,
true, Ctx);
1700template <
typename T>
1701inline std::enable_if_t<has_BlockScalarTraits<T>::value,
Input &>
1704 if (In.setCurrentDocument())
1710template <
typename T>
1711inline std::enable_if_t<has_CustomMappingTraits<T>::value,
Input &>
1714 if (In.setCurrentDocument())
1720template <
typename T>
1721inline std::enable_if_t<has_PolymorphicTraits<T>::value,
Input &>
1724 if (In.setCurrentDocument())
1730template <
typename T>
1731inline std::enable_if_t<missingTraits<T, EmptyContext>::value,
Input &>
1738template <
typename T>
1739inline std::enable_if_t<has_DocumentListTraits<T>::value, Output &>
1742 yout.beginDocuments();
1743 const size_t count = DocumentListTraits<T>::size(yout, docList);
1744 for (
size_t i = 0; i <
count; ++i) {
1745 if (yout.preflightDocument(i)) {
1746 yamlize(yout, DocumentListTraits<T>::element(yout, docList, i),
true,
1748 yout.postflightDocument();
1751 yout.endDocuments();
1756template <
typename T>
1757inline std::enable_if_t<has_MappingTraits<T, EmptyContext>::value,
Output &>
1760 yout.beginDocuments();
1761 if (yout.preflightDocument(0)) {
1762 yamlize(yout, map,
true, Ctx);
1763 yout.postflightDocument();
1765 yout.endDocuments();
1770template <
typename T>
1771inline std::enable_if_t<has_SequenceTraits<T>::value,
Output &>
1774 yout.beginDocuments();
1775 if (yout.preflightDocument(0)) {
1777 yout.postflightDocument();
1779 yout.endDocuments();
1784template <
typename T>
1785inline std::enable_if_t<has_BlockScalarTraits<T>::value,
Output &>
1788 Out.beginDocuments();
1789 if (Out.preflightDocument(0)) {
1791 Out.postflightDocument();
1798template <
typename T>
1799inline std::enable_if_t<has_CustomMappingTraits<T>::value,
Output &>
1802 Out.beginDocuments();
1803 if (Out.preflightDocument(0)) {
1805 Out.postflightDocument();
1813template <
typename T>
1814inline std::enable_if_t<has_PolymorphicTraits<T>::value,
Output &>
1817 Out.beginDocuments();
1818 if (Out.preflightDocument(0)) {
1822 "plain scalar documents are not supported");
1824 Out.postflightDocument();
1831template <
typename T>
1832inline std::enable_if_t<missingTraits<T, EmptyContext>::value,
Output &>
1843template <
typename T>
1847 using type =
typename T::value_type;
1851 if (index >=
seq.size())
1852 seq.resize(index + 1);
1854 if (index >=
seq.size()) {
1855 io.
setError(
Twine(
"value sequence extends beyond static size (") +
1864template <
typename T,
bool Flow>
1877template <
typename T>
1880 std::enable_if_t<CheckIsBool<SequenceElementTraits<T>::flow>::value>>
1882template <
typename T,
size_t N>
1885 std::enable_if_t<CheckIsBool<SequenceElementTraits<T>::flow>::value>>
1887template <
typename T,
unsigned N>
1890 std::enable_if_t<CheckIsBool<SequenceElementTraits<T>::flow>::value>>
1892template <
typename T>
1895 std::enable_if_t<CheckIsBool<SequenceElementTraits<T>::flow>::value>>
1897template <
typename T>
1900 std::enable_if_t<CheckIsBool<SequenceElementTraits<T>::flow>::value>>
1904template <
typename T>
1937#define LLVM_YAML_IS_SEQUENCE_VECTOR_IMPL(TYPE, FLOW) \
1941 !std::is_fundamental_v<TYPE> && !std::is_same_v<TYPE, std::string> && \
1942 !std::is_same_v<TYPE, llvm::StringRef>, \
1943 "only use LLVM_YAML_IS_SEQUENCE_VECTOR for types you control"); \
1944 template <> struct SequenceElementTraits<TYPE> { \
1945 static const bool flow = FLOW; \
1952#define LLVM_YAML_IS_SEQUENCE_VECTOR(type) \
1953 LLVM_YAML_IS_SEQUENCE_VECTOR_IMPL(type, false)
1957#define LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(type) \
1958 LLVM_YAML_IS_SEQUENCE_VECTOR_IMPL(type, true)
1960#define LLVM_YAML_DECLARE_MAPPING_TRAITS(Type) \
1963 template <> struct LLVM_ABI MappingTraits<Type> { \
1964 static void mapping(IO &IO, Type &Obj); \
1969#define LLVM_YAML_DECLARE_MAPPING_TRAITS_PRIVATE(Type) \
1972 template <> struct MappingTraits<Type> { \
1973 static void mapping(IO &IO, Type &Obj); \
1978#define LLVM_YAML_DECLARE_ENUM_TRAITS(Type) \
1981 template <> struct LLVM_ABI ScalarEnumerationTraits<Type> { \
1982 static void enumeration(IO &io, Type &Value); \
1987#define LLVM_YAML_DECLARE_BITSET_TRAITS(Type) \
1990 template <> struct LLVM_ABI ScalarBitSetTraits<Type> { \
1991 static void bitset(IO &IO, Type &Options); \
1996#define LLVM_YAML_DECLARE_SCALAR_TRAITS(Type, MustQuote) \
1999 template <> struct LLVM_ABI ScalarTraits<Type> { \
2000 static void output(const Type &Value, void *ctx, raw_ostream &Out); \
2001 static StringRef input(StringRef Scalar, void *ctxt, Type &Value); \
2002 static QuotingType mustQuote(StringRef) { return MustQuote; } \
2009#define LLVM_YAML_IS_DOCUMENT_LIST_VECTOR(_type) \
2012 template <unsigned N> \
2013 struct DocumentListTraits<SmallVector<_type, N>> \
2014 : public SequenceTraitsImpl<SmallVector<_type, N>, false> {}; \
2016 struct DocumentListTraits<std::vector<_type>> \
2017 : public SequenceTraitsImpl<std::vector<_type>, false> {}; \
2023#define LLVM_YAML_IS_STRING_MAP(_type) \
2027 struct CustomMappingTraits<std::map<std::string, _type>> \
2028 : 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.
@ 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