#ifndef UTIL_H #define UTIL_H #ifndef NULL #define NULL ((void*)0) #endif #include #include #include #include #include #include #include int ssystem(std::string command); std::string intToString(int theInt); std::string replaceExEscape(std::string first, std::string search, std::string replace); std::string strSlice(std::string str, int begin, int end); int findPerenEnd(std::string str, int i); std::vector split(const std::string &str, char delim); std::string join(const std::vector &strVec, std::string joinStr); std::string readFile(std::istream &file); std::string padWithSpaces(std::string str, int padTo); template class triple { public: T first; U second; V third; }; template triple make_triple(T f, U s, V t) { triple out; out.first = f; out.second = s; out.third = t; return out; } template bool contains(std::vector vec, T item) { for (auto i : vec) if (i == item) return true; return false; } template std::vector flatten(std::vector> vec) { std::vector flat; for (auto i : vec) flat.insert(flat.end(), i.begin(), i.end()); return flat; } template std::vector reverse(std::vector vec) { std::vector flat; flat.insert(flat.end(), vec.rbegin(), vec.rend()); return flat; } template std::vector dereferenced(std::vector vec) { std::vector de; for (T* i:vec) de.push_back(*i); return de; } template std::vector slice(std::vector vec, int begin, int end, int step = 1) { std::vector toReturn; if (begin < 0) begin += vec.size()+1; if (end < 0) end += vec.size()+1; for (int i = begin; i < end; i += step) toReturn.push_back(vec[i]); return toReturn; } template bool subset(std::set a, std::set b) { for (auto i : a) if (b.find(i) == b.end()) return false; return true; } #endif