9#ifndef LLVM_SUPPORT_YAMLTRAITS_H
10#define LLVM_SUPPORT_YAMLTRAITS_H
35#include <system_error>
335 using check = std::tuple<SameType<SignatureInput, &U::input>,
348 using check = std::tuple<SameType<SignatureInput, &U::input>,
362 using check = std::tuple<SameType<SignatureInput, &U::input>,
448 template <
class U>
using check =
decltype(&U::flow);
456 :
public std::bool_constant<has_SequenceMethodTraits<T>::value> {};
478 return Input.ltrim(
"0123456789");
483 if (S.
empty() || S ==
"+" || S ==
"-")
486 if (S ==
".nan" || S ==
".NaN" || S ==
".NAN")
501 return S.
size() > 2 &&
516 (S.
size() > 1 && std::strchr(
"0123456789", S[1]) ==
nullptr)))
535 if (S.
front() ==
'.') {
538 }
else if (S.
front() ==
'e' || S.
front() ==
'E') {
539 State = FoundExponent;
545 if (State == FoundDot) {
551 State = FoundExponent;
558 assert(State == FoundExponent &&
"Should have found exponent at this point.");
568 return skipDigits(S).empty();
572 return S ==
"null" || S ==
"Null" || S ==
"NULL" || S ==
"~";
577 return S ==
"true" || S ==
"True" || S ==
"TRUE" || S ==
"false" ||
578 S ==
"False" || S ==
"FALSE";
598 if (ForcePreserveAsString) {
610 if (std::strchr(R
"(-?:\,[]{}#&*!|>'"%@`)", S[0]) != nullptr)
613 for (
unsigned char C : S) {
660 return MaxQuotingNeeded;
663template <
typename T,
typename Context>
665 :
public std::bool_constant<
666 !has_ScalarEnumerationTraits<T>::value &&
667 !has_ScalarBitSetTraits<T>::value && !has_ScalarTraits<T>::value &&
668 !has_BlockScalarTraits<T>::value &&
669 !has_TaggedScalarTraits<T>::value &&
670 !has_MappingTraits<T, Context>::value &&
671 !has_SequenceTraits<T>::value && !has_CustomMappingTraits<T>::value &&
672 !has_DocumentListTraits<T>::value &&
673 !has_PolymorphicTraits<T>::value> {};
675template <
typename T,
typename Context>
677 :
public std::bool_constant<has_MappingTraits<T, Context>::value &&
678 has_MappingValidateTraits<T, Context>::value> {
681template <
typename T,
typename Context>
683 :
public std::bool_constant<has_MappingTraits<T, Context>::value &&
684 !has_MappingValidateTraits<T, Context>::value> {
690 IO(
void *Ctxt =
nullptr);
711 virtual std::vector<StringRef>
keys() = 0;
732 virtual std::error_code
error() = 0;
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(
StringRef Key, std::optional<T> &Val,
840 const std::optional<T> &DefaultValue,
843 template <
typename T,
typename Context>
844 void processKeyWithDefault(
StringRef 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(StringRef 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(
StringRef Key,
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(
StringRef,
bool)
override;
1350 bool matchEnumFallback()
override;
1351 void endEnumScalar()
override;
1352 bool beginBitSetScalar(
bool &)
override;
1353 bool bitSetMatch(
StringRef,
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 void saveAliasHNode(Node *node, HNode *hnode);
1427 Input::HNode *createHNodes(Node *node);
1428 void setError(HNode *hnode,
const Twine &message);
1429 void setError(Node *node,
const Twine &message);
1430 void setError(
const SMRange &
Range,
const Twine &message);
1432 void reportWarning(HNode *hnode,
const Twine &message);
1433 void reportWarning(Node *hnode,
const Twine &message);
1434 void reportWarning(
const SMRange &
Range,
const Twine &message);
1437 void releaseHNodeBuffers();
1442 bool setCurrentDocument();
1443 bool nextDocument();
1446 const Node *getCurrentNode()
const;
1448 void setAllowUnknownKeys(
bool Allow)
override;
1452 std::unique_ptr<llvm::yaml::Stream> Strm;
1453 HNode *TopNode =
nullptr;
1456 SpecificBumpPtrAllocator<EmptyHNode> EmptyHNodeAllocator;
1457 SpecificBumpPtrAllocator<ScalarHNode> ScalarHNodeAllocator;
1458 SpecificBumpPtrAllocator<MapHNode> MapHNodeAllocator;
1459 SpecificBumpPtrAllocator<SequenceHNode> SequenceHNodeAllocator;
1460 document_iterator DocIterator;
1461 llvm::BitVector BitValuesUsed;
1462 HNode *CurrentNode =
nullptr;
1463 bool ScalarMatchFound =
false;
1464 bool AllowUnknownKeys =
false;
1465 DenseMap<StringRef, HNode *>
AliasMap;
1484 bool outputting()
const override;
1486 void beginMapping()
override;
1487 void endMapping()
override;
1488 bool preflightKey(
StringRef Key,
bool,
bool,
bool &,
void *&)
override;
1489 void postflightKey(
void *)
override;
1490 std::vector<StringRef> keys()
override;
1491 void beginFlowMapping()
override;
1492 void endFlowMapping()
override;
1493 unsigned beginSequence()
override;
1494 void endSequence()
override;
1495 bool preflightElement(
unsigned,
void *&)
override;
1496 void postflightElement(
void *)
override;
1497 unsigned beginFlowSequence()
override;
1498 bool preflightFlowElement(
unsigned,
void *&)
override;
1499 void postflightFlowElement(
void *)
override;
1500 void endFlowSequence()
override;
1501 void beginEnumScalar()
override;
1502 bool matchEnumScalar(
StringRef,
bool)
override;
1503 bool matchEnumFallback()
override;
1504 void endEnumScalar()
override;
1505 bool beginBitSetScalar(
bool &)
override;
1506 bool bitSetMatch(
StringRef,
bool)
override;
1507 void endBitSetScalar()
override;
1509 void blockScalarString(
StringRef &)
override;
1510 void scalarTag(std::string &)
override;
1512 void setError(
const Twine &message)
override;
1513 std::error_code
error()
override;
1514 bool canElideEmptySequence()
override;
1518 void beginDocuments();
1519 bool preflightDocument(
unsigned);
1520 void postflightDocument();
1521 void endDocuments();
1527 void newLineCheck(
bool EmptySequence =
false);
1528 void outputNewLine();
1535 inFlowSeqFirstElement,
1536 inFlowSeqOtherElement,
1543 static bool inSeqAnyElement(InState State);
1544 static bool inFlowSeqAnyElement(InState State);
1545 static bool inMapAnyKey(InState State);
1546 static bool inFlowMapAnyKey(InState State);
1552 int ColumnAtFlowStart = 0;
1553 int ColumnAtMapFlowStart = 0;
1554 bool NeedBitValueComma =
false;
1555 bool NeedFlowSequenceComma =
false;
1556 bool EnumerationMatchFound =
false;
1557 bool WriteDefaultValues =
false;
1562template <
typename T,
typename Context>
1563void IO::processKeyWithDefault(StringRef
Key, std::optional<T> &Val,
1564 const std::optional<T> &DefaultValue,
1566 assert(!DefaultValue &&
"std::optional<T> shouldn't have a value!");
1568 bool UseDefault =
true;
1569 const bool sameAsDefault =
outputting() && !Val;
1579 bool IsNone =
false;
1581 if (
const auto *
Node =
1585 IsNone =
Node->getRawValue().rtrim(
' ') ==
"<none>";
1606#define LLVM_YAML_STRONG_TYPEDEF(_base, _type) \
1608 _type() = default; \
1609 _type(const _base v) : value(v) {} \
1610 _type(const _type &v) = default; \
1611 _type &operator=(const _type &rhs) = default; \
1612 _type &operator=(const _base &rhs) { \
1616 operator const _base &() const { return value; } \
1617 bool operator==(const _type &rhs) const { return value == rhs.value; } \
1618 bool operator==(const _base &rhs) const { return value == rhs; } \
1619 bool operator<(const _type &rhs) const { return value < rhs.value; } \
1621 using BaseType = _base; \
1665template <
typename T>
1666inline std::enable_if_t<has_DocumentListTraits<T>::value,
Input &>
1681template <
typename T>
1682inline std::enable_if_t<has_MappingTraits<T, EmptyContext>::value,
Input &>
1686 yamlize(yin, docMap,
true, Ctx);
1692template <
typename T>
1693inline std::enable_if_t<has_SequenceTraits<T>::value,
Input &>
1697 yamlize(yin, docSeq,
true, Ctx);
1702template <
typename T>
1703inline std::enable_if_t<has_BlockScalarTraits<T>::value,
Input &>
1706 if (In.setCurrentDocument())
1712template <
typename T>
1713inline std::enable_if_t<has_CustomMappingTraits<T>::value,
Input &>
1716 if (In.setCurrentDocument())
1722template <
typename T>
1723inline std::enable_if_t<has_PolymorphicTraits<T>::value,
Input &>
1726 if (In.setCurrentDocument())
1732template <
typename T>
1733inline std::enable_if_t<missingTraits<T, EmptyContext>::value,
Input &>
1740template <
typename T>
1741inline std::enable_if_t<has_DocumentListTraits<T>::value, Output &>
1744 yout.beginDocuments();
1745 const size_t count = DocumentListTraits<T>::size(yout, docList);
1746 for (
size_t i = 0; i <
count; ++i) {
1747 if (yout.preflightDocument(i)) {
1748 yamlize(yout, DocumentListTraits<T>::element(yout, docList, i),
true,
1750 yout.postflightDocument();
1753 yout.endDocuments();
1758template <
typename T>
1759inline std::enable_if_t<has_MappingTraits<T, EmptyContext>::value,
Output &>
1762 yout.beginDocuments();
1763 if (yout.preflightDocument(0)) {
1764 yamlize(yout, map,
true, Ctx);
1765 yout.postflightDocument();
1767 yout.endDocuments();
1772template <
typename T>
1773inline std::enable_if_t<has_SequenceTraits<T>::value,
Output &>
1776 yout.beginDocuments();
1777 if (yout.preflightDocument(0)) {
1779 yout.postflightDocument();
1781 yout.endDocuments();
1786template <
typename T>
1787inline std::enable_if_t<has_BlockScalarTraits<T>::value,
Output &>
1790 Out.beginDocuments();
1791 if (Out.preflightDocument(0)) {
1793 Out.postflightDocument();
1800template <
typename T>
1801inline std::enable_if_t<has_CustomMappingTraits<T>::value,
Output &>
1804 Out.beginDocuments();
1805 if (Out.preflightDocument(0)) {
1807 Out.postflightDocument();
1815template <
typename T>
1816inline std::enable_if_t<has_PolymorphicTraits<T>::value,
Output &>
1819 Out.beginDocuments();
1820 if (Out.preflightDocument(0)) {
1824 "plain scalar documents are not supported");
1826 Out.postflightDocument();
1833template <
typename T>
1834inline std::enable_if_t<missingTraits<T, EmptyContext>::value,
Output &>
1845template <
typename T>
1849 using type =
typename T::value_type;
1853 if (index >=
seq.size())
1854 seq.resize(index + 1);
1856 if (index >=
seq.size()) {
1857 io.
setError(
Twine(
"value sequence extends beyond static size (") +
1866template <
typename T,
bool Flow>
1879template <
typename T>
1882 std::enable_if_t<CheckIsBool<SequenceElementTraits<T>::flow>::value>>
1884template <
typename T,
size_t N>
1887 std::enable_if_t<CheckIsBool<SequenceElementTraits<T>::flow>::value>>
1889template <
typename T,
unsigned N>
1892 std::enable_if_t<CheckIsBool<SequenceElementTraits<T>::flow>::value>>
1894template <
typename T>
1897 std::enable_if_t<CheckIsBool<SequenceElementTraits<T>::flow>::value>>
1899template <
typename T>
1902 std::enable_if_t<CheckIsBool<SequenceElementTraits<T>::flow>::value>>
1906template <
typename T>
1939#define LLVM_YAML_IS_SEQUENCE_VECTOR_IMPL(TYPE, FLOW) \
1943 !std::is_fundamental_v<TYPE> && !std::is_same_v<TYPE, std::string> && \
1944 !std::is_same_v<TYPE, llvm::StringRef>, \
1945 "only use LLVM_YAML_IS_SEQUENCE_VECTOR for types you control"); \
1946 template <> struct SequenceElementTraits<TYPE> { \
1947 static const bool flow = FLOW; \
1954#define LLVM_YAML_IS_SEQUENCE_VECTOR(type) \
1955 LLVM_YAML_IS_SEQUENCE_VECTOR_IMPL(type, false)
1959#define LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(type) \
1960 LLVM_YAML_IS_SEQUENCE_VECTOR_IMPL(type, true)
1962#define LLVM_YAML_DECLARE_MAPPING_TRAITS(Type) \
1965 template <> struct LLVM_ABI MappingTraits<Type> { \
1966 static void mapping(IO &IO, Type &Obj); \
1971#define LLVM_YAML_DECLARE_MAPPING_TRAITS_PRIVATE(Type) \
1974 template <> struct MappingTraits<Type> { \
1975 static void mapping(IO &IO, Type &Obj); \
1980#define LLVM_YAML_DECLARE_ENUM_TRAITS(Type) \
1983 template <> struct LLVM_ABI ScalarEnumerationTraits<Type> { \
1984 static void enumeration(IO &io, Type &Value); \
1989#define LLVM_YAML_DECLARE_BITSET_TRAITS(Type) \
1992 template <> struct LLVM_ABI ScalarBitSetTraits<Type> { \
1993 static void bitset(IO &IO, Type &Options); \
1998#define LLVM_YAML_DECLARE_SCALAR_TRAITS(Type, MustQuote) \
2001 template <> struct LLVM_ABI ScalarTraits<Type> { \
2002 static void output(const Type &Value, void *ctx, raw_ostream &Out); \
2003 static StringRef input(StringRef Scalar, void *ctxt, Type &Value); \
2004 static QuotingType mustQuote(StringRef) { return MustQuote; } \
2011#define LLVM_YAML_IS_DOCUMENT_LIST_VECTOR(_type) \
2014 template <unsigned N> \
2015 struct DocumentListTraits<SmallVector<_type, N>> \
2016 : public SequenceTraitsImpl<SmallVector<_type, N>, false> {}; \
2018 struct DocumentListTraits<std::vector<_type>> \
2019 : public SequenceTraitsImpl<std::vector<_type>, false> {}; \
2025#define LLVM_YAML_IS_STRING_MAP(_type) \
2029 struct CustomMappingTraits<std::map<std::string, _type>> \
2030 : 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")
This file defines the DenseMap class.
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.
static constexpr size_t npos
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.
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
virtual void endSequence()=0
void bitSetCase(T &Val, StringRef Str, const T ConstVal)
virtual bool matchEnumScalar(StringRef, bool)=0
virtual void endEnumScalar()=0
void bitSetCase(T &Val, StringRef Str, const uint32_t ConstVal)
virtual bool outputting() const =0
virtual unsigned beginFlowSequence()=0
virtual bool mapTag(StringRef Tag, bool Default=false)=0
void mapOptionalWithContext(StringRef Key, T &Val, const DefaultT &Default, Context &Ctx)
virtual void endFlowSequence()=0
virtual void beginMapping()=0
virtual void setAllowUnknownKeys(bool Allow)
void mapOptionalWithContext(StringRef Key, std::optional< T > &Val, Context &Ctx)
void enumCase(T &Val, StringRef Str, const T ConstVal)
virtual void endMapping()=0
void mapOptionalWithContext(StringRef Key, T &Val, Context &Ctx)
virtual bool preflightElement(unsigned, void *&)=0
virtual unsigned beginSequence()=0
virtual void beginEnumScalar()=0
void maskedBitSetCase(T &Val, StringRef Str, uint32_t ConstVal, uint32_t Mask)
virtual std::error_code error()=0
virtual void scalarString(StringRef &, QuotingType)=0
virtual bool bitSetMatch(StringRef, bool)=0
void mapOptional(StringRef Key, T &Val)
virtual void setError(const Twine &)=0
void * getContext() const
virtual void postflightElement(void *)=0
virtual void postflightKey(void *)=0
void enumCase(T &Val, StringRef Str, const uint32_t ConstVal)
virtual void endFlowMapping()=0
void mapRequired(StringRef Key, T &Val, Context &Ctx)
void enumFallback(T &Val)
virtual void beginFlowMapping()=0
virtual bool preflightKey(StringRef, bool, bool, bool &, void *&)=0
void mapOptional(StringRef Key, T &Val, const DefaultT &Default)
void mapRequired(StringRef Key, T &Val)
virtual bool beginBitSetScalar(bool &)=0
virtual void blockScalarString(StringRef &)=0
virtual void scalarTag(std::string &)=0
virtual bool matchEnumFallback()=0
virtual bool preflightFlowElement(unsigned, void *&)=0
virtual void endBitSetScalar()=0
virtual std::vector< StringRef > keys()=0
void maskedBitSetCase(T &Val, StringRef Str, T ConstVal, T Mask)
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.
std::map< AliasEntry, AliasEntry > AliasMap
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...
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.
BumpPtrAllocatorImpl<> BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
@ Default
The result value is 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