627e1630d7a72641b73a797629e92be4c1411ad6
[scilab.git] / scilab / modules / xml / src / cpp / VariableScope.hxx
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2012 - Scilab Enterprises - Calixte DENIZET
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
10  *
11  */
12
13 #ifndef __VARIABLESCOPE_HXX__
14 #define __VARIABLESCOPE_HXX__
15
16 #include <map>
17 #include <stack>
18 #include <vector>
19 #include <libxml/xmlmemory.h>
20
21 namespace org_modules_xml
22 {
23 class XMLObject;
24 class XMLNodeList;
25
26 /**
27  * @file
28  * @author Calixte DENIZET <calixte.denizet@scilab.org>
29  *
30  * Class to handle the mapping between XMLObjects and their id
31  */
32 class VariableScope
33 {
34
35     std::vector < XMLObject * >*scope;
36     int position;
37     int initialSize;
38     std::stack < int >*freePlaces;
39
40     static std::map < const XMLObject *, std::vector < const XMLObject *>*>*parentToChildren;
41     static std::map < void *, XMLObject * >*mapLibXMLToXMLObject;
42     static std::map < void *, XMLNodeList * >*mapLibXMLToXMLNodeList;
43     static xmlFreeFunc XMLFreeFunc;
44
45 public:
46     /**
47      * Registers a pointer and its associated object.
48      * The aim of this mapping is to delete an existing object when a pointer
49      * in the xml tree is freed.
50      * @param libxml a pointer in the xml tree
51      * @param obj the corresponding object
52      */
53     static void registerPointers(void *libxml, XMLObject * obj);
54
55     /**
56      * Unregisters a pointer. It can be used when a pointer in the tree is freed or
57      * locally to avoid cyclic dependencies on removal.
58      * @param libxml a pointer in the xml tree
59      */
60     static void unregisterPointer(void *libxml);
61
62     /**
63      * Unregisters a pointer. It can be used when a pointer in the tree is freed or
64      * locally to avoid cyclic dependencies on removal.
65      * @param libxml a pointer in the xml tree
66      */
67     static void unregisterNodeListPointer(void *libxml);
68
69     /**
70      * Registers a pointer and its associated object.
71      * The aim of this mapping is to delete an existing object when a pointer
72      * in the xml tree is freed.
73      * @param libxml a pointer in the xml tree
74      * @param nodeList the corresponding nodeList
75      */
76     static void registerPointers(void *libxml, XMLNodeList * nodeList);
77
78     /**
79      * Default constructor
80      * @param initialSize the default size of the scope
81      */
82     VariableScope(int initialSize);
83
84     /**
85      * Destructor
86      */
87     ~VariableScope();
88
89     /**
90      * Gets the variable id from the object
91      * @param obj the object
92      * @return the corresponding id
93      */
94     int getVariableId(const XMLObject & obj);
95
96     /**
97      * Gets the object from the id
98      * @param id the object id
99      * @return the object pointer or 0 if not found
100      */
101     XMLObject *getVariableFromId(int id);
102
103     /**
104      * Removes an id from the scope
105      * @param id the id
106      */
107     void removeId(int id);
108
109     /**
110      * Gets the XMLObject associated with a libxml pointer
111      * @param libxml the libxml pointer
112      * @return the XMLObject pointer
113      */
114     XMLObject *getXMLObjectFromLibXMLPtr(void *libxml) const;
115
116     /**
117      * Gets the XMLNodeList associated with a libxml pointer
118      * @param libxml the libxml pointer
119      * @return the XMLNodeList pointer
120      */
121     XMLNodeList *getXMLNodeListFromLibXMLPtr(void *libxml) const;
122
123 private:
124     static void _xmlFreeFunc(void *mem);
125     static void initXMLMemory();
126     static xmlFreeFunc getFreeFunc(xmlFreeFunc freeFunc);
127
128     static void removeChildFromParent(const XMLObject * child);
129
130     /**
131      * Removes the object dependencies if they exist
132      * @param obj the object
133      */
134     void removeDependencies(XMLObject * obj);
135 };
136 }
137
138 #endif