libjmmcg  release_579_6_g8cffd
A C++ library containing an eclectic mix of useful, advanced components.
csv_iterator.hpp
Go to the documentation of this file.
1 #ifndef LIBJMMCG_CORE_CSV_ITERATOR_HPP
2 #define LIBJMMCG_CORE_CSV_ITERATOR_HPP
3 
4 /******************************************************************************
5 ** Copyright © 2020 by J.M.McGuiness, coder@hussar.me.uk & M.Waplington
6 **
7 ** This library is free software; you can redistribute it and/or
8 ** modify it under the terms of the GNU Lesser General Public
9 ** License as published by the Free Software Foundation; either
10 ** version 2.1 of the License, or (at your option) any later version.
11 **
12 ** This library is distributed in the hope that it will be useful,
13 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
14 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 ** Lesser General Public License for more details.
16 **
17 ** You should have received a copy of the GNU Lesser General Public
18 ** License along with this library; if not, write to the Free Software
19 ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 */
21 
22 #include "config.h"
23 
24 #include <istream>
25 #include <iterator>
26 #include <string>
27 
28 namespace jmmcg { namespace LIBJMMCG_VER_NAMESPACE {
29 
30 /**
31  * Taken from "Generic Programming and the STL" by M.H.Austern.
32  */
33 class csv_iterator {
34 public:
35  using iterator_category=std::input_iterator_tag;
36  using value_type=std::string;
38  using pointer=std::string const *;
39  using reference=std::string const&;
40 
41  explicit csv_iterator(char delim=default_delimiter) noexcept(true);
42  explicit csv_iterator(std::string const& data, char delim=default_delimiter) noexcept(false);
43 
44  reference operator*() const noexcept(true);
45  pointer operator->() const noexcept(true);
46 
47  csv_iterator operator++() noexcept(false);
48  [[nodiscard]] csv_iterator operator++(int) noexcept(false);
49 
50  bool operator==(csv_iterator const& i) const noexcept(true);
51  bool operator!=(csv_iterator const& i) const noexcept(true);
52 
53 private:
54  static inline constexpr const char default_delimiter=',';
55 
56  std::string const* data_{nullptr};
57  char delim_;
58  std::size_t pos_{};
59  bool valid_{};
60  std::string field_{};
61 
62  void read() noexcept(false);
63 };
64 
65 } }
66 
68 
69 #endif