| #ifndef LIBTRELLIS_UTIL_HPP |
| #define LIBTRELLIS_UTIL_HPP |
| |
| #include <string> |
| #include <sstream> |
| #include <iomanip> |
| #include <cstdint> |
| #include <vector> |
| #include <boost/range/adaptor/reversed.hpp> |
| |
| using namespace std; |
| |
| namespace Trellis { |
| enum class VerbosityLevel { |
| ERROR, |
| NOTE, |
| DEBUG, |
| }; |
| extern VerbosityLevel verbosity; |
| |
| inline string uint32_to_hexstr(uint32_t val) { |
| ostringstream os; |
| os << "0x" << hex << setw(8) << setfill('0') << val; |
| return os.str(); |
| } |
| |
| inline string to_string(const vector<bool> &bv) { |
| ostringstream os; |
| for (auto bit : boost::adaptors::reverse(bv)) |
| os << (bit ? '1' : '0'); |
| return os.str(); |
| } |
| |
| inline istream &operator>>(istream &in, vector<bool> &bv) { |
| bv.clear(); |
| string s; |
| in >> s; |
| for (auto c : boost::adaptors::reverse(s)) { |
| assert((c == '0') || (c == '1')); |
| bv.push_back((c == '1')); |
| } |
| return in; |
| } |
| |
| // Skip whitespace, optionally including newlines |
| inline void skip_blank(istream &in, bool nl = false) { |
| int c = in.peek(); |
| while (in && (((c == ' ') || (c == '\t')) || (nl && ((c == '\n') || (c == '\r'))))) { |
| in.get(); |
| c = in.peek(); |
| } |
| } |
| // Return true if end of line (or file) |
| inline bool skip_check_eol(istream &in) { |
| skip_blank(in, false); |
| if (!in) |
| return false; |
| int c = in.peek(); |
| // Comments count as end of line |
| if (c == '#') { |
| in.get(); |
| c = in.peek(); |
| while (in && c != EOF && c != '\n') { |
| in.get(); |
| c = in.peek(); |
| } |
| return true; |
| } |
| return (c == EOF || c == '\n'); |
| } |
| |
| |
| // Skip past blank lines and comments |
| inline void skip(istream &in) { |
| skip_blank(in, true); |
| while (in && (in.peek() == '#')) { |
| // Skip comment line |
| skip_check_eol(in); |
| skip_blank(in, true); |
| } |
| } |
| |
| // Return true if at the end of a record (or file) |
| inline bool skip_check_eor(istream &in) { |
| skip(in); |
| int c = in.peek(); |
| return (c == EOF || c == '.'); |
| } |
| |
| // Return true if at the end of file |
| inline bool skip_check_eof(istream &in) { |
| skip(in); |
| int c = in.peek(); |
| return (c == EOF); |
| } |
| |
| |
| } |
| #define fmt(x) (static_cast<const std::ostringstream&>(std::ostringstream() << x).str()) |
| |
| #define UNUSED(x) (void)(x) |
| |
| #endif //LIBTRELLIS_UTIL_HPP |