Program Listing for File csv_reader.h

Return to documentation for file (include/csv_reader.h)

#ifndef ECHELLESIMULATOR_CSV_READER_H
#define ECHELLESIMULATOR_CSV_READER_H

#include <string>
#include <sstream>
#include <vector>

class CSVRow {
public:
    std::string const &operator[](std::size_t index) const {
        return m_data[index];
    }

    std::size_t size() const {
        return m_data.size();
    }

    void readNextRow(std::istream &str) {
        std::string line;
        std::getline(str, line);

        std::stringstream lineStream(line);
        std::string cell;

        m_data.clear();
        while (std::getline(lineStream, cell, ';')) {
            m_data.push_back(cell);
        }
    }

private:
    std::vector<std::string> m_data;
};

inline std::istream &operator>>(std::istream &str, CSVRow &data) {
    data.readNextRow(str);
    return str;
}


class CSVIterator {
public:
    typedef std::input_iterator_tag iterator_category;
    typedef CSVRow value_type;
    typedef std::size_t difference_type;
    typedef CSVRow *pointer;
    typedef CSVRow &reference;

    CSVIterator(std::istream &str) : m_str(str.good() ? &str : NULL) { ++(*this); }

    CSVIterator() : m_str(NULL) {}

    // Pre Increment
    CSVIterator &operator++() {
        if (m_str) { if (!((*m_str) >> m_row)) { m_str = NULL; }}
        return *this;
    }

    // Post increment
    CSVIterator operator++(int) {
        CSVIterator tmp(*this);
        ++(*this);
        return tmp;
    }

    CSVRow const &operator*() const { return m_row; }

    CSVRow const *operator->() const { return &m_row; }

    bool operator==(CSVIterator const &rhs) {
        return ((this == &rhs) || ((this->m_str == NULL) && (rhs.m_str == NULL)));
    }

    bool operator!=(CSVIterator const &rhs) { return !((*this) == rhs); }


private:
    std::istream *m_str;
    CSVRow m_row;
};


#endif //ECHELLESIMULATOR_CSV_READER_H