b74ce1a313c3e07be49b2d1298c1694003b9b515
[alexxy/gromacs.git] / src / gromacs / selection / parser_internal.h
1 /*
2  * This file is part of the GROMACS molecular simulation package.
3  *
4  * Copyright (c) 2012,2014, by the GROMACS development team, led by
5  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
6  * and including many others, as listed in the AUTHORS file in the
7  * top-level source directory and at http://www.gromacs.org.
8  *
9  * GROMACS is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public License
11  * as published by the Free Software Foundation; either version 2.1
12  * of the License, or (at your option) any later version.
13  *
14  * GROMACS is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with GROMACS; if not, see
21  * http://www.gnu.org/licenses, or write to the Free Software Foundation,
22  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
23  *
24  * If you want to redistribute modifications to GROMACS, please
25  * consider that scientific software is very special. Version
26  * control is crucial - bugs must be traceable. We will be happy to
27  * consider code for inclusion in the official distribution, but
28  * derived work must not be called official GROMACS. Details are found
29  * in the README & COPYING files - if they are missing, get the
30  * official version at http://www.gromacs.org.
31  *
32  * To help us fund GROMACS development, we humbly ask that you cite
33  * the research papers on the package. Check out http://www.gromacs.org.
34  */
35 /*! \internal \file
36  * \brief Helper functions for the selection parser.
37  *
38  * This header is includes only from parser.cpp (generated from parser.y), and
39  * it includes functions and macros used internally by the parser.
40  * They are in a separate file to make then easier to edit (no need to
41  * regenerate the parser), and to keep parser.y as simple as possible.
42  *
43  * \author Teemu Murtola <teemu.murtola@gmail.com>
44  * \ingroup module_selection
45  */
46 #ifndef GMX_SELECTION_PARSER_INTERNAL_H
47 #define GMX_SELECTION_PARSER_INTERNAL_H
48
49 #include <exception>
50
51 #include <boost/scoped_ptr.hpp>
52
53 #include "gromacs/utility/gmxassert.h"
54
55 #include "parsetree.h"
56 #include "selelem.h"
57
58 #include "scanner.h"
59
60 #include "config.h"
61
62 //! Error handler needed by Bison.
63 static void
64 yyerror(yyscan_t scanner, char const *s)
65 {
66     _gmx_selparser_error(scanner, "%s", s);
67 }
68
69 /*! \name Exception handling macros for actions
70  *
71  * These macros should be used at the beginning and end of each semantic action
72  * that may throw an exception. For robustness, it's best to wrap all actions
73  * that call functions declared outside parser.y should be wrapped.
74  * These macros take care to catch any exceptions, store the exception (or
75  * handle it and allow the parser to continue), and terminate the parser
76  * cleanly if necessary.
77  * The code calling the parser should use
78  * _gmx_sel_lexer_rethrow_exception_if_occurred() to rethrow any exceptions.
79  * \{
80  */
81 //! Starts an action that may throw exceptions.
82 #define BEGIN_ACTION \
83     try {
84 //! Finishes an action that may throw exceptions.
85 #define END_ACTION \
86     } \
87     catch (const std::exception &ex) \
88     { \
89         if (_gmx_selparser_handle_exception(scanner, ex)) { \
90             YYERROR; } \
91         else{ \
92             YYABORT; } \
93     }
94 //!\}
95
96 #ifndef GMX_CXX11
97 //! No-op to enable use of same get()/set() implementation as with C++11.
98 static gmx::SelectionParserValue &move(gmx::SelectionParserValue &src)
99 {
100     return src;
101 }
102 //! No-op to enable use of same get()/set() implementation as with C++11.
103 static gmx::SelectionParserParameter &move(gmx::SelectionParserParameter &src)
104 {
105     return src;
106 }
107 #endif
108
109 /*! \brief
110  * Retrieves a semantic value.
111  *
112  * \param[in] src  Semantic value to get the value from.
113  * \returns   Retrieved value.
114  * \throws    unspecified  Any exception thrown by the move constructor of
115  *      ValueType (copy constructor if GMX_CXX11 is not set).
116  *
117  * There should be no statements that may throw exceptions in actions before
118  * this function has been called for all semantic values that have a C++ object
119  * stored.  Together with set(), this function abstracts away exception
120  * safety issues that arise from the use of a plain pointer for storing the
121  * semantic values.
122  *
123  * Does not throw for smart pointer types.  If used with types that may throw,
124  * the order of operations should be such that it is exception-safe.
125  */
126 template <typename ValueType> static
127 ValueType get(ValueType *src)
128 {
129     GMX_RELEASE_ASSERT(src != NULL, "Semantic value pointers should be non-NULL");
130     boost::scoped_ptr<ValueType> srcGuard(src);
131     return ValueType(move(*src));
132 }
133 /*! \brief
134  * Sets a semantic value.
135  *
136  * \tparam     ValueType Type of value to set.
137  * \param[out] dest  Semantic value to set (typically $$).
138  * \param[in]  value Value to put into the semantic value.
139  * \throws     std::bad_alloc if out of memory.
140  * \throws     unspecified  Any exception thrown by the move constructor of
141  *      ValueType (copy constructor if GMX_CXX11 is not set).
142  *
143  * This should be the last statement before ::END_ACTION, except for a
144  * possible ::CHECK_SEL.
145  */
146 template <typename ValueType> static
147 void set(ValueType * &dest, ValueType value)
148 {
149     dest = new ValueType(move(value));
150 }
151 /*! \brief
152  * Sets an empty semantic value.
153  *
154  * \tparam     ValueType Type of value to set (must be default constructible).
155  * \param[out] dest  Semantic value to set (typically $$).
156  * \throws     std::bad_alloc if out of memory.
157  * \throws     unspecified  Any exception thrown by the default constructor of
158  *      ValueType.
159  *
160  * This should be the last statement before ::END_ACTION, except for a
161  * possible ::CHECK_SEL.
162  */
163 template <typename ValueType> static
164 void set_empty(ValueType * &dest)
165 {
166     dest = new ValueType;
167 }
168 /*! \brief
169  * Checks that a valid tree was set.
170  *
171  * Should be called after set() if it was used to set a value where NULL
172  * pointer indicates an error.
173  *
174  * \todo
175  * Get rid of this macro.  It should now be possible to handle all errors using
176  * exceptions.
177  */
178 #define CHECK_SEL(sel) \
179     if (!*(sel)) { \
180         delete sel; \
181         YYERROR; \
182     }
183
184 #endif