forked from OSchip/llvm-project
Make YAML support SmallVector
Currently YAML sequences require std::vectors. All of the methods that the YAML parser accesses though are present in SmallVector, so there's no reason we can't support SmallVector inherently. This patch does that. Reviewed By: majnemer Differential Revision: https://reviews.llvm.org/D23213 llvm-svn: 277870
This commit is contained in:
parent
d0de3683ec
commit
9c3dac8efd
|
@ -1359,66 +1359,63 @@ operator<<(Output &yout, T &seq) {
|
|||
return yout;
|
||||
}
|
||||
|
||||
template <typename T> struct SequenceTraitsImpl {
|
||||
typedef typename T::value_type _type;
|
||||
static size_t size(IO &io, T &seq) { return seq.size(); }
|
||||
static _type &element(IO &io, T &seq, size_t index) {
|
||||
if (index >= seq.size())
|
||||
seq.resize(index + 1);
|
||||
return seq[index];
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace yaml
|
||||
} // namespace llvm
|
||||
|
||||
/// Utility for declaring that a std::vector of a particular type
|
||||
/// should be considered a YAML sequence.
|
||||
#define LLVM_YAML_IS_SEQUENCE_VECTOR(_type) \
|
||||
namespace llvm { \
|
||||
namespace yaml { \
|
||||
template<> \
|
||||
struct SequenceTraits< std::vector<_type> > { \
|
||||
static size_t size(IO &io, std::vector<_type> &seq) { \
|
||||
return seq.size(); \
|
||||
} \
|
||||
static _type& element(IO &io, std::vector<_type> &seq, size_t index) {\
|
||||
if ( index >= seq.size() ) \
|
||||
seq.resize(index+1); \
|
||||
return seq[index]; \
|
||||
} \
|
||||
}; \
|
||||
} \
|
||||
#define LLVM_YAML_IS_SEQUENCE_VECTOR(_type) \
|
||||
namespace llvm { \
|
||||
namespace yaml { \
|
||||
template <> \
|
||||
struct SequenceTraits<std::vector<_type>> \
|
||||
: public SequenceTraitsImpl<std::vector<_type>> {}; \
|
||||
template <unsigned N> \
|
||||
struct SequenceTraits<SmallVector<_type, N>> \
|
||||
: public SequenceTraitsImpl<SmallVector<_type, N>> {}; \
|
||||
} \
|
||||
}
|
||||
|
||||
/// Utility for declaring that a std::vector of a particular type
|
||||
/// should be considered a YAML flow sequence.
|
||||
#define LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(_type) \
|
||||
namespace llvm { \
|
||||
namespace yaml { \
|
||||
template<> \
|
||||
struct SequenceTraits< std::vector<_type> > { \
|
||||
static size_t size(IO &io, std::vector<_type> &seq) { \
|
||||
return seq.size(); \
|
||||
} \
|
||||
static _type& element(IO &io, std::vector<_type> &seq, size_t index) {\
|
||||
(void)flow; /* Remove this workaround after PR17897 is fixed */ \
|
||||
if ( index >= seq.size() ) \
|
||||
seq.resize(index+1); \
|
||||
return seq[index]; \
|
||||
} \
|
||||
static const bool flow = true; \
|
||||
}; \
|
||||
} \
|
||||
#define LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(_type) \
|
||||
namespace llvm { \
|
||||
namespace yaml { \
|
||||
template <unsigned N> \
|
||||
struct SequenceTraits<SmallVector<_type, N>> \
|
||||
: public SequenceTraitsImpl<SmallVector<_type, N>> { \
|
||||
static const bool flow = true; \
|
||||
}; \
|
||||
template <> \
|
||||
struct SequenceTraits<std::vector<_type>> \
|
||||
: public SequenceTraitsImpl<std::vector<_type>> { \
|
||||
static const bool flow = true; \
|
||||
}; \
|
||||
} \
|
||||
}
|
||||
|
||||
/// Utility for declaring that a std::vector of a particular type
|
||||
/// should be considered a YAML document list.
|
||||
#define LLVM_YAML_IS_DOCUMENT_LIST_VECTOR(_type) \
|
||||
namespace llvm { \
|
||||
namespace yaml { \
|
||||
template<> \
|
||||
struct DocumentListTraits< std::vector<_type> > { \
|
||||
static size_t size(IO &io, std::vector<_type> &seq) { \
|
||||
return seq.size(); \
|
||||
} \
|
||||
static _type& element(IO &io, std::vector<_type> &seq, size_t index) {\
|
||||
if ( index >= seq.size() ) \
|
||||
seq.resize(index+1); \
|
||||
return seq[index]; \
|
||||
} \
|
||||
}; \
|
||||
} \
|
||||
#define LLVM_YAML_IS_DOCUMENT_LIST_VECTOR(_type) \
|
||||
namespace llvm { \
|
||||
namespace yaml { \
|
||||
template <unsigned N> \
|
||||
struct DocumentListTraits<SmallVector<_type, N>> \
|
||||
: public SequenceTraitsImpl<SmallVector<_type, N>> {}; \
|
||||
template <> \
|
||||
struct DocumentListTraits<std::vector<_type>> \
|
||||
: public SequenceTraitsImpl<std::vector<_type>> {}; \
|
||||
} \
|
||||
}
|
||||
|
||||
#endif // LLVM_SUPPORT_YAMLTRAITS_H
|
||||
|
|
Loading…
Reference in New Issue