Use smart pointers to manage the selection tree.
[alexxy/gromacs.git] / src / gromacs / selection / selectioncollection-impl.h
1 /*
2  *
3  *                This source code is part of
4  *
5  *                 G   R   O   M   A   C   S
6  *
7  *          GROningen MAchine for Chemical Simulations
8  *
9  * Written by David van der Spoel, Erik Lindahl, Berk Hess, and others.
10  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
11  * Copyright (c) 2001-2009, The GROMACS development team,
12  * check out http://www.gromacs.org for more information.
13
14  * This program is free software; you can redistribute it and/or
15  * modify it under the terms of the GNU General Public License
16  * as published by the Free Software Foundation; either version 2
17  * of the License, or (at your option) any later version.
18  *
19  * If you want to redistribute modifications, please consider that
20  * scientific software is very special. Version control is crucial -
21  * bugs must be traceable. We will be happy to consider code for
22  * inclusion in the official distribution, but derived work must not
23  * be called official GROMACS. Details are found in the README & COPYING
24  * files - if they are missing, get the official version at www.gromacs.org.
25  *
26  * To help us fund GROMACS development, we humbly ask that you cite
27  * the papers on the package - you can find them in the top README file.
28  *
29  * For more info, check our website at http://www.gromacs.org
30  */
31 /*! \internal \file
32  * \brief
33  * Declares private implementation class for gmx::SelectionCollection.
34  *
35  * This header also defines ::gmx_ana_selcollection_t, which is used in the old
36  * C code for handling selection collections.
37  *
38  * \author Teemu Murtola <teemu.murtola@cbr.su.se>
39  * \ingroup module_selection
40  */
41 #ifndef GMX_SELECTION_SELECTIONCOLLECTION_IMPL_H
42 #define GMX_SELECTION_SELECTIONCOLLECTION_IMPL_H
43
44 #include <string>
45 #include <vector>
46
47 #include "../legacyheaders/typedefs.h"
48
49 #include "../onlinehelp/helptopicinterface.h"
50 #include "../utility/uniqueptr.h"
51 #include "indexutil.h"
52 #include "poscalc.h"
53 #include "selection.h" // For gmx::SelectionList
54 #include "selectioncollection.h"
55 #include "selelem.h"
56
57 namespace gmx
58 {
59 //! Smart pointer for managing an internal selection data object.
60 typedef gmx_unique_ptr<internal::SelectionData>::type SelectionDataPointer;
61 //! Container for storing a list of selections internally.
62 typedef std::vector<SelectionDataPointer> SelectionDataList;
63 }
64
65 /*! \internal \brief
66  * Information for a collection of selections.
67  *
68  * \ingroup module_selection
69  */
70 struct gmx_ana_selcollection_t
71 {
72     //! Position calculation collection used for selection position evaluation.
73     gmx::PositionCalculationCollection  pcc;
74     //! Root of the selection element tree.
75     gmx::SelectionTreeElementPointer    root;
76     /*! \brief
77      * Array of compiled selections.
78      *
79      * Has the responsibility of managing the memory for the contained objects,
80      * but note that gmx::Selection instances also hold pointers to the
81      * objects.
82      */
83     gmx::SelectionDataList         sel;
84     /** Number of variables defined. */
85     int                            nvars;
86     /** Selection strings for variables. */
87     char                         **varstrs;
88
89     /** Topology for the collection. */
90     t_topology                    *top;
91     /** Index group that contains all the atoms. */
92     struct gmx_ana_index_t         gall;
93     /** Memory pool used for selection evaluation. */
94     struct gmx_sel_mempool_t      *mempool;
95     /** Parser symbol table. */
96     struct gmx_sel_symtab_t     *symtab;
97     //! Root of help topic tree (NULL is no help yet requested).
98     gmx::HelpTopicPointer          rootHelp;
99 };
100
101 namespace gmx
102 {
103
104 class MessageStringCollector;
105
106 /*! \internal \brief
107  * Private implemention class for SelectionCollection.
108  *
109  * \ingroup module_selection
110  */
111 class SelectionCollection::Impl
112 {
113     public:
114         /*! \brief
115          * Creates a new selection collection.
116          *
117          * \throws  std::bad_alloc if out of memory.
118          */
119         Impl();
120         ~Impl();
121
122         /*! \brief
123          * Clears the symbol table of the selection collection.
124          *
125          * Does not throw.
126          */
127         void clearSymbolTable();
128         /*! \brief
129          * Replace group references by group contents.
130          *
131          * \param[in]    root    Root of selection tree to process.
132          * \param        errors  Object for reporting any error messages.
133          *
134          * Recursively searches the selection tree for unresolved external
135          * references.  If one is found, finds the referenced group in
136          * \a grps_ and replaces the reference with a constant element that
137          * contains the atoms from the referenced group.  Any failures to
138          * resolve references are reported to \p errors.
139          *
140          * Does not throw currently, but this is subject to change when more
141          * underlying code is converted to C++.
142          */
143         void resolveExternalGroups(const gmx::SelectionTreeElementPointer &root,
144                                    MessageStringCollector *errors);
145
146         //! Internal data, used for interfacing with old C code.
147         gmx_ana_selcollection_t sc_;
148         //! Default reference position type for selections.
149         std::string             rpost_;
150         //! Default output position type for selections.
151         std::string             spost_;
152         /*! \brief
153          * Debugging level for the collection.
154          *
155          * Possible values:
156          *  - 0: no debugging
157          *  - 1: print selection trees after parsing and compilation
158          *  - 2: like 1, also print intermediate compilation trees
159          *  - 3: like 1, also print the tree after evaluation
160          *  - 4: combine 2 and 3
161          */
162         int                     debugLevel_;
163         //! Whether setIndexGroups() has been called.
164         bool                    bExternalGroupsSet_;
165         //! External index groups (can be NULL).
166         gmx_ana_indexgrps_t    *grps_;
167 };
168
169 /*! \internal \brief
170  * Implements selection evaluation.
171  *
172  * This class is used to implement SelectionCollection::evaluate() and
173  * SelectionCollection::evaluateFinal().
174  *
175  * \ingroup module_selection
176  */
177 class SelectionEvaluator
178 {
179     public:
180         SelectionEvaluator();
181
182         /*! \brief
183          * Evaluates selections in a collection.
184          */
185         void evaluate(SelectionCollection *sc, t_trxframe *fr, t_pbc *pbc);
186         /*! \brief
187          * Evaluates the final state for dynamic selections.
188          */
189         void evaluateFinal(SelectionCollection *sc, int nframes);
190 };
191
192 } // namespace gmx
193
194 #endif