LCOV - code coverage report
Current view: top level - usr/include/boost/wave/util - file_position.hpp (source / functions) Hit Total Coverage
Test: ROSE Lines: 0 15 0.0 %
Date: 2022-12-08 13:48:47 Functions: 0 1 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*=============================================================================
       2             :     Boost.Wave: A Standard compliant C++ preprocessor library
       3             : 
       4             :     Definition of the position_iterator and file_position templates
       5             : 
       6             :     http://www.boost.org/
       7             : 
       8             :     Copyright (c) 2001-2012 Hartmut Kaiser. Distributed under the Boost
       9             :     Software License, Version 1.0. (See accompanying file
      10             :     LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
      11             : =============================================================================*/
      12             : 
      13             : #if !defined(FILE_POSITION_H_52BDEDF7_DAD3_4F24_802F_E66BB8098F68_INCLUDED)
      14             : #define FILE_POSITION_H_52BDEDF7_DAD3_4F24_802F_E66BB8098F68_INCLUDED
      15             : 
      16             : #include <string>
      17             : #include <ostream>
      18             : 
      19             : #include <boost/assert.hpp>
      20             : #include <boost/spirit/include/classic_version.hpp>
      21             : #include <boost/spirit/include/classic_position_iterator.hpp>
      22             : #include <boost/wave/wave_config.hpp>
      23             : #if BOOST_WAVE_SERIALIZATION != 0
      24             : #include <boost/serialization/serialization.hpp>
      25             : #endif
      26             : 
      27             : // this must occur after all of the includes and before any code appears
      28             : #ifdef BOOST_HAS_ABI_HEADERS
      29             : #include BOOST_ABI_PREFIX
      30             : #endif
      31             : 
      32             : ///////////////////////////////////////////////////////////////////////////////
      33             : namespace boost {
      34             : namespace wave {
      35             : namespace util {
      36             : 
      37             : ///////////////////////////////////////////////////////////////////////////////
      38             : //
      39             : //  file_position
      40             : //
      41             : //  A structure to hold positional information. This includes the filename,
      42             : //  line number and column number of a current token position.
      43             : //
      44             : ///////////////////////////////////////////////////////////////////////////////
      45             : 
      46             : template <typename StringT>
      47           0 : struct file_position {
      48             : 
      49             : public:
      50             :     typedef StringT string_type;
      51             : 
      52           0 :     file_position()
      53           0 :     :   file(), line(1), column(1)
      54             :     {}
      55           0 :     explicit file_position(string_type const& file_, std::size_t line_ = 1,
      56             :             std::size_t column_ = 1)
      57           0 :     :   file(file_), line(line_), column(column_)
      58             :     {}
      59             : 
      60             : // accessors
      61           0 :     string_type const &get_file() const { return file; }
      62           0 :     std::size_t get_line() const { return line; }
      63           0 :     std::size_t get_column() const { return column; }
      64             : 
      65           0 :     void set_file(string_type const &file_)
      66             :     {
      67           0 :         file = file_;
      68             :     }
      69           0 :     void set_line(std::size_t line_) { line = line_; }
      70           0 :     void set_column(std::size_t column_) { column = column_; }
      71             : 
      72             : private:
      73             : #if BOOST_WAVE_SERIALIZATION != 0
      74             :     friend class boost::serialization::access;
      75             :     template<typename Archive>
      76             :     void serialize(Archive &ar, const unsigned int version)
      77             :     {
      78             :         using namespace boost::serialization;
      79             :         ar & make_nvp("filename", file);
      80             :         ar & make_nvp("line", line);
      81             :         ar & make_nvp("column", column);
      82             :     }
      83             : #endif
      84             : 
      85             :     string_type file;
      86             :     std::size_t line;
      87             :     std::size_t column;
      88             : };
      89             : 
      90             : template <typename StringT>
      91           0 : bool operator== (file_position<StringT> const &lhs,
      92             :     file_position<StringT> const &rhs)
      93             : {
      94           0 :     return lhs.get_column() == rhs.get_column() &&
      95           0 :         lhs.get_line() == rhs.get_line() && lhs.get_file() == rhs.get_file();
      96             : }
      97             : 
      98             : template <typename StringT>
      99             : inline std::ostream &
     100             : operator<< (std::ostream &o, file_position<StringT> const &pos)
     101             : {
     102             :     o << pos.get_file() << ":" << pos.get_line() << ":"  << pos.get_column();
     103             :     return o;
     104             : }
     105             : 
     106             : typedef file_position<BOOST_WAVE_STRINGTYPE> file_position_type;
     107             : 
     108             : ///////////////////////////////////////////////////////////////////////////////
     109             : //
     110             : //  position_iterator
     111             : //
     112             : //  The position_iterator used by Wave is now based on the corresponding Spirit
     113             : //  type. This type is used with our own file_position though. The needed
     114             : //  specialization of the boost::spirit::classic::position_policy class is
     115             : //  provided below.
     116             : //
     117             : ///////////////////////////////////////////////////////////////////////////////
     118             : 
     119             : template <typename IteratorT, typename PositionT>
     120             : struct position_iterator
     121             : :   boost::spirit::classic::position_iterator<IteratorT, PositionT>
     122             : {
     123             :     typedef boost::spirit::classic::position_iterator<IteratorT, PositionT> base_type;
     124             : 
     125             :     position_iterator()
     126             :     {
     127             :     }
     128             : 
     129             :     position_iterator(IteratorT const &begin, IteratorT const &end,
     130             :             PositionT const &pos)
     131             :     :   base_type(begin, end, pos)
     132             :     {
     133             :     }
     134             : };
     135             : 
     136             : ///////////////////////////////////////////////////////////////////////////////
     137             : }   // namespace util
     138             : }   // namespace wave
     139             : 
     140             : ///////////////////////////////////////////////////////////////////////////////
     141             : 
     142             : namespace spirit { namespace classic {
     143             : 
     144             : ///////////////////////////////////////////////////////////////////////////////
     145             : //
     146             : //  The boost::spirit::classic::position_policy has to be specialized for our
     147             : //  file_position class
     148             : //
     149             : ///////////////////////////////////////////////////////////////////////////////
     150             : 
     151             :     template <>
     152             :     class position_policy<boost::wave::util::file_position_type> {
     153             : 
     154             :     public:
     155             :         position_policy()
     156             :             : m_CharsPerTab(4)
     157             :         {}
     158             : 
     159             :         void next_line(boost::wave::util::file_position_type &pos)
     160             :         {
     161             :             pos.set_line(pos.get_line() + 1);
     162             :             pos.set_column(1);
     163             :         }
     164             : 
     165             :         void set_tab_chars(unsigned int chars)
     166             :         {
     167             :             m_CharsPerTab = chars;
     168             :         }
     169             : 
     170             :         void next_char(boost::wave::util::file_position_type &pos)
     171             :         {
     172             :             pos.set_column(pos.get_column() + 1);
     173             :         }
     174             : 
     175             :         void tabulation(boost::wave::util::file_position_type &pos)
     176             :         {
     177             :             pos.set_column(pos.get_column() + m_CharsPerTab -
     178             :                 (pos.get_column() - 1) % m_CharsPerTab);
     179             :         }
     180             : 
     181             :     private:
     182             :         unsigned int m_CharsPerTab;
     183             :     };
     184             : 
     185             : ///////////////////////////////////////////////////////////////////////////////
     186             : }}   // namespace spirit::classic
     187             : 
     188             : }   // namespace boost
     189             : 
     190             : // the suffix header occurs after all of the code
     191             : #ifdef BOOST_HAS_ABI_HEADERS
     192             : #include BOOST_ABI_SUFFIX
     193             : #endif
     194             : 
     195             : #endif // !defined(FILE_POSITION_H_52BDEDF7_DAD3_4F24_802F_E66BB8098F68_INCLUDED)

Generated by: LCOV version 1.14