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