| 62 | |
| 63 | template <typename CharT,typename Container> |
| 64 | void parse_column_names(const std::basic_string<CharT>& names, |
| 65 | Container& cont) |
| 66 | { |
| 67 | column_state state = column_state::sequence; |
| 68 | typename Container::value_type buffer(cont.get_allocator()); |
| 69 | |
| 70 | auto p = names.begin(); |
| 71 | while (p != names.end()) |
| 72 | { |
| 73 | switch (state) |
| 74 | { |
| 75 | case column_state::sequence: |
| 76 | { |
| 77 | switch (*p) |
| 78 | { |
| 79 | case ' ': case '\t':case '\r': case '\n': |
| 80 | ++p; |
| 81 | break; |
| 82 | default: |
| 83 | buffer.clear(); |
| 84 | state = column_state::label; |
| 85 | break; |
| 86 | } |
| 87 | break; |
| 88 | } |
| 89 | case column_state::label: |
| 90 | { |
| 91 | switch (*p) |
| 92 | { |
| 93 | case ',': |
| 94 | cont.push_back(buffer); |
| 95 | buffer.clear(); |
| 96 | ++p; |
| 97 | state = column_state::sequence; |
| 98 | break; |
| 99 | default: |
| 100 | buffer.push_back(*p); |
| 101 | ++p; |
| 102 | break; |
| 103 | } |
| 104 | break; |
| 105 | } |
| 106 | } |
| 107 | } |
| 108 | if (state == column_state::label) |
| 109 | { |
| 110 | cont.push_back(buffer); |
| 111 | buffer.clear(); |
| 112 | } |
| 113 | |
| 114 | } // namespace detail |
| 115 | |
| 116 | template <typename CharT,typename Container> |
| 117 | void parse_column_types(const std::basic_string<CharT>& types, |
no test coverage detected