| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- //
- // json_direct_vector_binder.hpp
- // json
- //
- // Created by Sam Jaffe on 4/23/16.
- //
- #pragma once
- namespace json { namespace binder {
- template <typename T, typename V>
- class direct_binder<T, std::vector<V> > : public binder_impl<T> {
- public:
- direct_binder(std::vector<V> T::*p, binder<V> const&i);
- virtual binder_impl<T>* clone() const override { return new direct_binder(*this); }
-
- virtual void parse(T& val, char const*& data, parser::options opts) const override {
- const char ch = json::helper::get_next_element(data);
- if (ch != '[') {
- throw json::malformed_json_exception("Expected an array type");
- }
- ++data;
-
- V to_make;
- std::vector<V>& vec = val.*ptr;
- while (*data && *data != ']') {
- impl.parse(to_make, data, opts);
- vec.emplace_back(to_make);
- json::helper::advance_to_boundary(']', data);
- }
- if (*data) ++data;
- else throw json::unterminated_json_exception("Reached end of parse string without finding array end");
- }
-
- virtual void write(T const& val, std::ostream & data) const override {
- data << '[';
- std::vector<V> const & vec = val.*ptr;
- typename std::vector<V>::const_iterator it = vec.begin(), end = vec.end();
- if (it != end) {
- impl.write(*it, data);
- for (++it; it != end; ++it) {
- data << ",";
- impl.write(*it, data);
- }
- }
- data << ']';
- }
- private:
- std::vector<V> T::*ptr;
- binder<V> impl;
- };
- } }
|