← index
cplusplus11.Examples/persist/persist-vector.hpp
Source: cplusplus11.Examples/persist/persist-vector.hpp
/*
 
 Example C++ Persist Vector Template
 written by Jared Bruni
 
 in public domain
 
*/



#ifndef __PERSIST_VECTOR__H__
#define __PERSIST_VECTOR__H__

#include<iostream>
#include<string>
#include<vector>
#include<cstdlib>
#include<fstream>

namespace persist {
    
    
    // Default Read/Write function objects work with POD types
    template<typename T>
    class DefaultRead {
    public:
        void operator()(T &type, std::fstream &file) {
            file.read(reinterpret_cast<char*>(&type), sizeof(T));
            
        }
    };
    
    template<typename T>
    class DefaultWrite {
    public:
        void operator()(T &type, std::fstream &file) {
            file.write(reinterpret_cast<char*>(&type), sizeof(T));
        }
    };
    
    
    // class template for persist vector
    template<typename T, typename Read = DefaultRead<T>, typename Write = DefaultWrite<T>>
    class Vector {
    public:
        // constructor initalize
        Vector(std::string file_name, size_t res) : file_n(file_name) {
            // read
            vec.reserve(res);
            readFile(file_name);
        }
        
        ~Vector() {
            writeFile(file_n);
        }
        
        // connstructors
        Vector(const Vector<T,Read,Write> &cv) : vec(cv.vec), file_n(cv.file_n) {
            
        }
        
        Vector(const Vector<T,Read,Write> &&cv) : vec(std::move(cv.vec)), file_n(cv.file_n) {
            
        }
        
        // overloaded = operators
        Vector<T,Read,Write> &operator=(const Vector<T,Read,Write> &cv) {
            vec = cv.vec;
            file_n = cv.file_n;
        }
        
        Vector<T,Read,Write> &operator=(const Vector<T,Read,Write> &&cv) {
            vec = std::move(cv.vec);
            file_n = cv.file_n;
        }
        
        // read vector from file
        void readFile(std::string filename) {
            std::fstream file;
            file.open(filename, std::ios::in | std::ios::binary);
            if(!file.is_open()) {
                std::cerr << "Error opening file: " << filename << "\n";
                return;
            }
            while(file && !file.eof()) {
                T type;
                read_f(type, file);
                if(file) vec.push_back(type);
            }
            file.close();
        }
        // write vector to file
        void writeFile(std::string filename) {
            std::fstream file;
            file.open(filename, std::ios::out | std::ios::binary);
            if(!file.is_open()) {
                std::cerr << "Error opening file: " << filename << "\n";
                return;
            }
            for(auto i = vec.begin(), end = vec.end(); i != end; ++i) {
                write_f(*i,file);
            }
            file.close();
        }
        
        T &operator[](size_t pos) {
            return vec[pos];
        }
        
        // use -> operator to access the vector
        inline std::vector<T> *operator->() { return &vec; }
        // use 'getvector' to get reference to vector
        inline std::vector<T> &operator*() { return vec; }
    protected:
        std::vector<T> vec;
        std::string file_n;
    private:
        Read read_f; // read function object
        Write write_f; // write function object
    };
    
}










#endif