Chris@16: /*============================================================================= Chris@16: Boost.Wave: A Standard compliant C++ preprocessor library Chris@16: Chris@16: Definition of the position_iterator and file_position templates Chris@16: Chris@16: http://www.boost.org/ Chris@16: Chris@16: Copyright (c) 2001-2012 Hartmut Kaiser. Distributed under the Boost Chris@16: Software License, Version 1.0. (See accompanying file Chris@16: LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: =============================================================================*/ Chris@16: Chris@16: #if !defined(FILE_POSITION_H_52BDEDF7_DAD3_4F24_802F_E66BB8098F68_INCLUDED) Chris@16: #define FILE_POSITION_H_52BDEDF7_DAD3_4F24_802F_E66BB8098F68_INCLUDED Chris@16: Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #if BOOST_WAVE_SERIALIZATION != 0 Chris@16: #include Chris@16: #endif Chris@16: Chris@16: // this must occur after all of the includes and before any code appears Chris@16: #ifdef BOOST_HAS_ABI_HEADERS Chris@16: #include BOOST_ABI_PREFIX Chris@16: #endif Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: namespace boost { Chris@16: namespace wave { Chris@16: namespace util { Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // Chris@16: // file_position Chris@16: // Chris@16: // A structure to hold positional information. This includes the filename, Chris@16: // line number and column number of a current token position. Chris@16: // Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: Chris@16: template Chris@16: struct file_position { Chris@16: Chris@16: public: Chris@16: typedef StringT string_type; Chris@16: Chris@16: file_position() Chris@16: : file(), line(1), column(1) Chris@16: {} Chris@16: explicit file_position(string_type const& file_, std::size_t line_ = 1, Chris@16: std::size_t column_ = 1) Chris@16: : file(file_), line(line_), column(column_) Chris@16: {} Chris@16: Chris@16: // accessors Chris@16: string_type const &get_file() const { return file; } Chris@16: std::size_t get_line() const { return line; } Chris@16: std::size_t get_column() const { return column; } Chris@16: Chris@16: void set_file(string_type const &file_) Chris@16: { Chris@16: file = file_; Chris@16: } Chris@16: void set_line(std::size_t line_) { line = line_; } Chris@16: void set_column(std::size_t column_) { column = column_; } Chris@16: Chris@16: private: Chris@16: #if BOOST_WAVE_SERIALIZATION != 0 Chris@16: friend class boost::serialization::access; Chris@16: template Chris@16: void serialize(Archive &ar, const unsigned int version) Chris@16: { Chris@16: using namespace boost::serialization; Chris@16: ar & make_nvp("filename", file); Chris@16: ar & make_nvp("line", line); Chris@16: ar & make_nvp("column", column); Chris@16: } Chris@16: #endif Chris@16: Chris@16: string_type file; Chris@16: std::size_t line; Chris@16: std::size_t column; Chris@16: }; Chris@16: Chris@16: template Chris@16: bool operator== (file_position const &lhs, Chris@16: file_position const &rhs) Chris@16: { Chris@16: return lhs.get_column() == rhs.get_column() && Chris@16: lhs.get_line() == rhs.get_line() && lhs.get_file() == rhs.get_file(); Chris@16: } Chris@16: Chris@16: template Chris@16: inline std::ostream & Chris@16: operator<< (std::ostream &o, file_position const &pos) Chris@16: { Chris@16: o << pos.get_file() << ":" << pos.get_line() << ":" << pos.get_column(); Chris@16: return o; Chris@16: } Chris@16: Chris@16: typedef file_position file_position_type; Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // Chris@16: // position_iterator Chris@16: // Chris@16: // The position_iterator used by Wave is now based on the corresponding Spirit Chris@16: // type. This type is used with our own file_position though. The needed Chris@16: // specialization of the boost::spirit::classic::position_policy class is Chris@16: // provided below. Chris@16: // Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: Chris@16: template Chris@16: struct position_iterator Chris@16: : boost::spirit::classic::position_iterator Chris@16: { Chris@16: typedef boost::spirit::classic::position_iterator base_type; Chris@16: Chris@16: position_iterator() Chris@16: { Chris@16: } Chris@16: Chris@16: position_iterator(IteratorT const &begin, IteratorT const &end, Chris@16: PositionT const &pos) Chris@16: : base_type(begin, end, pos) Chris@16: { Chris@16: } Chris@16: }; Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: } // namespace util Chris@16: } // namespace wave Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: Chris@16: namespace spirit { namespace classic { Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // Chris@16: // The boost::spirit::classic::position_policy has to be specialized for our Chris@16: // file_position class Chris@16: // Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: Chris@16: template <> Chris@16: class position_policy { Chris@16: Chris@16: public: Chris@16: position_policy() Chris@16: : m_CharsPerTab(4) Chris@16: {} Chris@16: Chris@16: void next_line(boost::wave::util::file_position_type &pos) Chris@16: { Chris@16: pos.set_line(pos.get_line() + 1); Chris@16: pos.set_column(1); Chris@16: } Chris@16: Chris@16: void set_tab_chars(unsigned int chars) Chris@16: { Chris@16: m_CharsPerTab = chars; Chris@16: } Chris@16: Chris@16: void next_char(boost::wave::util::file_position_type &pos) Chris@16: { Chris@16: pos.set_column(pos.get_column() + 1); Chris@16: } Chris@16: Chris@16: void tabulation(boost::wave::util::file_position_type &pos) Chris@16: { Chris@16: pos.set_column(pos.get_column() + m_CharsPerTab - Chris@16: (pos.get_column() - 1) % m_CharsPerTab); Chris@16: } Chris@16: Chris@16: private: Chris@16: unsigned int m_CharsPerTab; Chris@16: }; Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: }} // namespace spirit::classic Chris@16: Chris@16: } // namespace boost Chris@16: Chris@16: // the suffix header occurs after all of the code Chris@16: #ifdef BOOST_HAS_ABI_HEADERS Chris@16: #include BOOST_ABI_SUFFIX Chris@16: #endif Chris@16: Chris@16: #endif // !defined(FILE_POSITION_H_52BDEDF7_DAD3_4F24_802F_E66BB8098F68_INCLUDED)