| 2990 | } |
| 2991 | |
| 2992 | std::shared_ptr<base> parse_array(std::string::iterator& it, |
| 2993 | std::string::iterator& end) |
| 2994 | { |
| 2995 | // this gets ugly because of the "homogeneity" restriction: |
| 2996 | // arrays can either be of only one type, or contain arrays |
| 2997 | // (each of those arrays could be of different types, though) |
| 2998 | // |
| 2999 | // because of the latter portion, we don't really have a choice |
| 3000 | // but to represent them as arrays of base values... |
| 3001 | ++it; |
| 3002 | |
| 3003 | // ugh---have to read the first value to determine array type... |
| 3004 | skip_whitespace_and_comments(it, end); |
| 3005 | |
| 3006 | // edge case---empty array |
| 3007 | if (*it == ']') |
| 3008 | { |
| 3009 | ++it; |
| 3010 | return make_array(); |
| 3011 | } |
| 3012 | |
| 3013 | auto val_end = std::find_if( |
| 3014 | it, end, [](char c) { return c == ',' || c == ']' || c == '#'; }); |
| 3015 | parse_type type = determine_value_type(it, val_end); |
| 3016 | switch (type) |
| 3017 | { |
| 3018 | case parse_type::STRING: |
| 3019 | return parse_value_array<std::string>(it, end); |
| 3020 | case parse_type::LOCAL_TIME: |
| 3021 | return parse_value_array<local_time>(it, end); |
| 3022 | case parse_type::LOCAL_DATE: |
| 3023 | return parse_value_array<local_date>(it, end); |
| 3024 | case parse_type::LOCAL_DATETIME: |
| 3025 | return parse_value_array<local_datetime>(it, end); |
| 3026 | case parse_type::OFFSET_DATETIME: |
| 3027 | return parse_value_array<offset_datetime>(it, end); |
| 3028 | case parse_type::INT: |
| 3029 | return parse_value_array<int64_t>(it, end); |
| 3030 | case parse_type::FLOAT: |
| 3031 | return parse_value_array<double>(it, end); |
| 3032 | case parse_type::BOOL: |
| 3033 | return parse_value_array<bool>(it, end); |
| 3034 | case parse_type::ARRAY: |
| 3035 | return parse_object_array<array>(&parser::parse_array, '[', it, |
| 3036 | end); |
| 3037 | case parse_type::INLINE_TABLE: |
| 3038 | return parse_object_array<table_array>( |
| 3039 | &parser::parse_inline_table, '{', it, end); |
| 3040 | default: |
| 3041 | throw_parse_exception("Unable to parse array"); |
| 3042 | } |
| 3043 | } |
| 3044 | |
| 3045 | template <class Value> |
| 3046 | std::shared_ptr<array> parse_value_array(std::string::iterator& it, |
no test coverage detected