Skip to content

Commit

Permalink
Make YAML support SmallVector
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Zachary Turner committed Aug 5, 2016
1 parent d0de368 commit 9c3dac8
Showing 1 changed file with 44 additions and 47 deletions.
91 changes: 44 additions & 47 deletions llvm/include/llvm/Support/YAMLTraits.h
Expand Up @@ -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

0 comments on commit 9c3dac8

Please sign in to comment.