Blame d4_ce/position.hh

Packit a4aae4
// A Bison parser, made by GNU Bison 3.0.4.
Packit a4aae4
Packit a4aae4
// Positions for Bison parsers in C++
Packit a4aae4
Packit a4aae4
// Copyright (C) 2002-2015 Free Software Foundation, Inc.
Packit a4aae4
Packit a4aae4
// This program is free software: you can redistribute it and/or modify
Packit a4aae4
// it under the terms of the GNU General Public License as published by
Packit a4aae4
// the Free Software Foundation, either version 3 of the License, or
Packit a4aae4
// (at your option) any later version.
Packit a4aae4
Packit a4aae4
// This program is distributed in the hope that it will be useful,
Packit a4aae4
// but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit a4aae4
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit a4aae4
// GNU General Public License for more details.
Packit a4aae4
Packit a4aae4
// You should have received a copy of the GNU General Public License
Packit a4aae4
// along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit a4aae4
Packit a4aae4
// As a special exception, you may create a larger work that contains
Packit a4aae4
// part or all of the Bison parser skeleton and distribute that work
Packit a4aae4
// under terms of your choice, so long as that work isn't itself a
Packit a4aae4
// parser generator using the skeleton or a modified version thereof
Packit a4aae4
// as a parser skeleton.  Alternatively, if you modify or redistribute
Packit a4aae4
// the parser skeleton itself, you may (at your option) remove this
Packit a4aae4
// special exception, which will cause the skeleton and the resulting
Packit a4aae4
// Bison output files to be licensed under the GNU General Public
Packit a4aae4
// License without this special exception.
Packit a4aae4
Packit a4aae4
// This special exception was added by the Free Software Foundation in
Packit a4aae4
// version 2.2 of Bison.
Packit a4aae4
Packit a4aae4
/**
Packit a4aae4
 ** \file position.hh
Packit a4aae4
 ** Define the libdap::position class.
Packit a4aae4
 */
Packit a4aae4
Packit a4aae4
#ifndef YY_YY_POSITION_HH_INCLUDED
Packit a4aae4
# define YY_YY_POSITION_HH_INCLUDED
Packit a4aae4
Packit a4aae4
# include <algorithm> // std::max
Packit a4aae4
# include <iostream>
Packit a4aae4
# include <string>
Packit a4aae4
Packit a4aae4
# ifndef YY_NULLPTR
Packit a4aae4
#  if defined __cplusplus && 201103L <= __cplusplus
Packit a4aae4
#   define YY_NULLPTR nullptr
Packit a4aae4
#  else
Packit a4aae4
#   define YY_NULLPTR 0
Packit a4aae4
#  endif
Packit a4aae4
# endif
Packit a4aae4
Packit a4aae4
#line 35 "d4_ce_parser.yy" // location.cc:337
Packit a4aae4
namespace libdap {
Packit a4aae4
#line 56 "position.hh" // location.cc:337
Packit a4aae4
  /// Abstract a position.
Packit a4aae4
  class position
Packit a4aae4
  {
Packit a4aae4
  public:
Packit a4aae4
    /// Construct a position.
Packit a4aae4
    explicit position (std::string* f = YY_NULLPTR,
Packit a4aae4
                       unsigned int l = 1u,
Packit a4aae4
                       unsigned int c = 1u)
Packit a4aae4
      : filename (f)
Packit a4aae4
      , line (l)
Packit a4aae4
      , column (c)
Packit a4aae4
    {
Packit a4aae4
    }
Packit a4aae4
Packit a4aae4
Packit a4aae4
    /// Initialization.
Packit a4aae4
    void initialize (std::string* fn = YY_NULLPTR,
Packit a4aae4
                     unsigned int l = 1u,
Packit a4aae4
                     unsigned int c = 1u)
Packit a4aae4
    {
Packit a4aae4
      filename = fn;
Packit a4aae4
      line = l;
Packit a4aae4
      column = c;
Packit a4aae4
    }
Packit a4aae4
Packit a4aae4
    /** \name Line and Column related manipulators
Packit a4aae4
     ** \{ */
Packit a4aae4
    /// (line related) Advance to the COUNT next lines.
Packit a4aae4
    void lines (int count = 1)
Packit a4aae4
    {
Packit a4aae4
      if (count)
Packit a4aae4
        {
Packit a4aae4
          column = 1u;
Packit a4aae4
          line = add_ (line, count, 1);
Packit a4aae4
        }
Packit a4aae4
    }
Packit a4aae4
Packit a4aae4
    /// (column related) Advance to the COUNT next columns.
Packit a4aae4
    void columns (int count = 1)
Packit a4aae4
    {
Packit a4aae4
      column = add_ (column, count, 1);
Packit a4aae4
    }
Packit a4aae4
    /** \} */
Packit a4aae4
Packit a4aae4
    /// File name to which this position refers.
Packit a4aae4
    std::string* filename;
Packit a4aae4
    /// Current line number.
Packit a4aae4
    unsigned int line;
Packit a4aae4
    /// Current column number.
Packit a4aae4
    unsigned int column;
Packit a4aae4
Packit a4aae4
  private:
Packit a4aae4
    /// Compute max(min, lhs+rhs) (provided min <= lhs).
Packit a4aae4
    static unsigned int add_ (unsigned int lhs, int rhs, unsigned int min)
Packit a4aae4
    {
Packit a4aae4
      return (0 < rhs || -static_cast<unsigned int>(rhs) < lhs
Packit a4aae4
              ? rhs + lhs
Packit a4aae4
              : min);
Packit a4aae4
    }
Packit a4aae4
  };
Packit a4aae4
Packit a4aae4
  /// Add \a width columns, in place.
Packit a4aae4
  inline position&
Packit a4aae4
  operator+= (position& res, int width)
Packit a4aae4
  {
Packit a4aae4
    res.columns (width);
Packit a4aae4
    return res;
Packit a4aae4
  }
Packit a4aae4
Packit a4aae4
  /// Add \a width columns.
Packit a4aae4
  inline position
Packit a4aae4
  operator+ (position res, int width)
Packit a4aae4
  {
Packit a4aae4
    return res += width;
Packit a4aae4
  }
Packit a4aae4
Packit a4aae4
  /// Subtract \a width columns, in place.
Packit a4aae4
  inline position&
Packit a4aae4
  operator-= (position& res, int width)
Packit a4aae4
  {
Packit a4aae4
    return res += -width;
Packit a4aae4
  }
Packit a4aae4
Packit a4aae4
  /// Subtract \a width columns.
Packit a4aae4
  inline position
Packit a4aae4
  operator- (position res, int width)
Packit a4aae4
  {
Packit a4aae4
    return res -= width;
Packit a4aae4
  }
Packit a4aae4
Packit a4aae4
  /// Compare two position objects.
Packit a4aae4
  inline bool
Packit a4aae4
  operator== (const position& pos1, const position& pos2)
Packit a4aae4
  {
Packit a4aae4
    return (pos1.line == pos2.line
Packit a4aae4
            && pos1.column == pos2.column
Packit a4aae4
            && (pos1.filename == pos2.filename
Packit a4aae4
                || (pos1.filename && pos2.filename
Packit a4aae4
                    && *pos1.filename == *pos2.filename)));
Packit a4aae4
  }
Packit a4aae4
Packit a4aae4
  /// Compare two position objects.
Packit a4aae4
  inline bool
Packit a4aae4
  operator!= (const position& pos1, const position& pos2)
Packit a4aae4
  {
Packit a4aae4
    return !(pos1 == pos2);
Packit a4aae4
  }
Packit a4aae4
Packit a4aae4
  /** \brief Intercept output stream redirection.
Packit a4aae4
   ** \param ostr the destination output stream
Packit a4aae4
   ** \param pos a reference to the position to redirect
Packit a4aae4
   */
Packit a4aae4
  template <typename YYChar>
Packit a4aae4
  inline std::basic_ostream<YYChar>&
Packit a4aae4
  operator<< (std::basic_ostream<YYChar>& ostr, const position& pos)
Packit a4aae4
  {
Packit a4aae4
    if (pos.filename)
Packit a4aae4
      ostr << *pos.filename << ':';
Packit a4aae4
    return ostr << pos.line << '.' << pos.column;
Packit a4aae4
  }
Packit a4aae4
Packit a4aae4
#line 35 "d4_ce_parser.yy" // location.cc:337
Packit a4aae4
} // libdap
Packit a4aae4
#line 180 "position.hh" // location.cc:337
Packit a4aae4
#endif // !YY_YY_POSITION_HH_INCLUDED