00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef MORE_IO_SOURCEREF_H
00031 #define MORE_IO_SOURCEREF_H
00032
00033 #include <iosfwd>
00034 #include <string>
00035
00036
00037 namespace more {
00038 namespace io {
00039
00040 struct sourceref
00041 {
00042 struct stdin_tag {};
00043 #ifndef stdin
00044 static const stdin_tag stdin;
00045 #endif
00046
00047 explicit sourceref(stdin_tag, int l = 1, int c = 0)
00048 : m_line(l), m_column(c) {}
00049 explicit sourceref(std::string const& f, int l = 1, int c = 0)
00050 : m_file(f), m_line(l), m_column(c) {}
00051 sourceref()
00052 : m_file("[unknown]"), m_line(-1), m_column(-1) {}
00053
00054 void next(int n = 1) { m_column += n; }
00055 void tabulator() { m_column = (m_column/8 + 1)*8; }
00056 void newline(int n = 1);
00057 void rewind() { m_line = 1; m_column = 0; }
00058
00059 bool is_stdin() const { return m_file.empty(); }
00060 bool is_unknown() const { return m_line == -1; }
00061
00062 std::string const& file_name() const { return m_file; }
00063 void set_file_name(std::string const& f) { m_file = f; }
00064 int line() const { return m_line; }
00065 void set_line(int i) { m_line = i; }
00066 int column() const { return m_column; }
00067 void set_column(int i) { m_column = i; }
00068
00069 bool operator==(sourceref const& rhs) const
00070 {
00071 return m_file == rhs.m_file
00072 && m_line == rhs.m_line
00073 && m_column == rhs.m_column;
00074 }
00075
00076 private:
00077 std::string m_file;
00078 int m_line;
00079 int m_column;
00080 };
00081
00082 template<typename Char, typename Traits>
00083 std::basic_ostream<Char, Traits>&
00084 operator<<(std::basic_ostream<Char, Traits>& os, sourceref const& loc);
00085
00086 }}
00087
00088 #endif