parser: remove a memory leak on /* block comments */
[scilab.git] / scilab / modules / ast / includes / exps / location.hxx
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2007-2008 - DIGITEO - Bruno JOFRET
4  *
5  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13  *
14  */
15
16 /**
17 ** \file location.hxx
18 ** Define the Location class.
19 */
20
21 #ifndef __LOCATION_HXX__
22 #define __LOCATION_HXX__
23
24 #include <iostream>
25 #include <string>
26 #include <sstream>
27
28 /** \brief Abstract a Location. */
29 class Location
30 {
31     /** \name Ctor & dtor.
32     ** \{ */
33 public:
34     /** \brief Construct a Location. */
35     Location (void)
36     {
37         first_line = last_line = 0;
38         first_column = last_column = 0;
39     }
40     /** \} */
41
42     Location(int _first_line, int _last_line, int _first_column, int _last_column) : first_line(_first_line), first_column(_first_column), last_line(_last_line), last_column(_last_column)
43     {
44     }
45
46     Location* clone()
47     {
48         Location* ret = new Location();
49         ret->first_line = first_line;
50         ret->first_column = first_column;
51         ret->last_line = last_line;
52         ret->last_column = last_column;
53         return ret;
54     }
55
56     /** \name Line and Column related manipulators
57     ** \{ */
58 public:
59     /** \brief Reset initial location to final location. */
60     inline void step (void)
61     {
62         first_line = last_line;
63         first_column = last_column;
64     }
65
66     /** \brief Extend the current location to the COUNT next columns. */
67     inline void columns (unsigned int count = 1)
68     {
69         last_column += count;
70     }
71
72     /** \brief Extend the current location to the COUNT next lines. */
73     inline void lines (unsigned int count = 1)
74     {
75         last_line += count;
76     }
77     /** \} */
78
79     inline bool operator<(const Location & loc) const
80     {
81         return first_line < loc.first_line || (first_line == loc.first_line && first_column < loc.first_column);
82     }
83
84     inline bool operator==(const Location & loc) const
85     {
86         return first_line == loc.first_line && first_column == loc.first_column && last_line == loc.last_line && last_column == loc.last_column;
87     }
88
89     inline bool operator!=(const Location & loc) const
90     {
91         return !(*this == loc);
92     }
93
94     std::wstring getLocationString() const
95     {
96         std::wostringstream os;
97         os << L" (" << first_line << L"," << first_column << L")";
98         return os.str();
99     }
100
101     friend std::wostream & operator<<(std::wostream & out, const Location & loc)
102     {
103         out << L"(" << loc.first_line << L"," << loc.first_column << L") to (" << loc.last_line << L"," << loc.last_column << L")";
104         return out;
105     }
106
107 public:
108     /** \brief Beginning of the located region. */
109     int first_line;
110     int first_column;
111     /** \brief End of the located region. */
112     int last_line;
113     int last_column;
114 };
115
116 #endif //! __LOCATION_HXX__