cplusplus11.Examples/templates/template-class.cpp
Source: cplusplus11.Examples/templates/template-class.cpp
/*
Source File can access text by line / col.
written to be generic
*/
#include<iostream>
#include<string>
#include<vector>
#include<fstream>
template<typename T = std::basic_string<char>, typename Stream = std::basic_fstream<char, std::char_traits<char>>>
class SourceFile {
public:
SourceFile();
SourceFile(const SourceFile<T> &t);
SourceFile<T> &operator=(const SourceFile<T> &t);
SourceFile(SourceFile<T> &&t);
SourceFile<T> &operator=(SourceFile<T> &&t);
bool readFile(const T &path);
T &operator[](unsigned int line);
std::size_t size() const { return code.size(); }
private:
std::vector<T> code;
};
template<typename T, typename Stream>
SourceFile<T,Stream>::SourceFile() {
}
template<typename T, typename Stream>
SourceFile<T,Stream>::SourceFile(const SourceFile<T> &t) {
code = t.code;
}
template<typename T, typename Stream>
SourceFile<T> &SourceFile<T,Stream>::operator=(const SourceFile<T> &t) {
if (this == &t) {
return *this;
}
code = t.code;
return *this;
}
template<typename T, typename Stream>
SourceFile<T,Stream>::SourceFile(SourceFile<T> &&t) {
code = std::move(t.code);
}
template<typename T, typename Stream>
SourceFile<T> &SourceFile<T,Stream>::operator=(SourceFile<T> &&t) {
code = std::move(t.code);
return *this;
}
template<typename T, typename Stream>
bool SourceFile<T,Stream>::readFile(const T &path) {
Stream file;
file.open(path, std::ios::in);
if(!file.is_open()) return false;
while(!file.eof()) {
T s;
std::getline(file, s);
if(file) code.push_back(s);
}
file.close();
return true;
}
template<typename T, typename Stream>
T &SourceFile<T,Stream>::operator[](unsigned int line) {
if(line < code.size()) return code[line];
throw std::out_of_range("wrong index");
}
int main(int argc, char **argv) {
if(argc != 2) {
std::cout << "Error requires one argument..\n";
return 0;
}
SourceFile<std::string> source;
if(source.readFile(argv[1])) {
std::cout << "File opened and read...: " << source.size() << "\n";
for(unsigned int i = 0; i < source.size(); ++i) {
std::cout << i << ": " << source[i] << "\n";
}
} else {
std::cout << "Could not read file..\n";
}
return 0;
}