xref: /AOO41X/main/autodoc/source/display/inc/toolkit/out_node.hxx (revision 1c78a5d6c0093dece4c096ba53051800fbad6e33)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef ADC_DISPLAY_OUT_NODE_HXX
25 #define ADC_DISPLAY_OUT_NODE_HXX
26 
27 
28 
29 
30 namespace output
31 {
32 
33 
34 /** @resp
35     Represents a tree of names where each node can have only one parent,
36     but a list of children.
37 
38     @see    Position
39     @see    Tree
40 */
41 class Node
42 {
43   public:
44     typedef std::vector< Node* >    List;
45     typedef UINT32                  relative_id;
46 
47     // LIFECYCLE
48     enum E_NullObject { null_object };
49 
50                         Node();
51     explicit            Node(
52                             E_NullObject        );
53                         ~Node();
54 
55     // OPERATORS
operator ==(const Node & i_node) const56     bool                operator==(
57                             const Node &        i_node ) const
58                                                 { return pParent == i_node.pParent AND sName == i_node.sName; }
operator !=(const Node & i_node) const59     bool                operator!=(
60                             const Node &        i_node ) const
61                                                 { return NOT operator==(i_node); }
62 
63     // OPERATIONS
64     /// Seek, and if not existent, create.
65     Node &              Provide_Child(
66                             const String &      i_name );
67     /// Seek, and if not existent, create.
Provide_Child(const StringVector & i_path)68     Node &              Provide_Child(
69                             const StringVector &
70                                                 i_path )
71                                                 { return provide_Child(i_path.begin(), i_path.end()); }
72     // INQUIRY
Depth() const73     intt                Depth() const           { return nDepth; }
74 
Name() const75     const String &      Name() const            { return sName; }
76     /// @return Id of a namespace or class etc. this directory represents.
RelatedNameRoom() const77     relative_id         RelatedNameRoom() const { return nNameRoomId; }
78     /// @return No delimiter at start, with delimiter at end.
79     void                Get_Path(
80                             StreamStr &         o_result,
81                             intt                i_maxDepth = -1 ) const;
82     void                Get_Chain(
83                             StringVector &      o_result,
84                             intt                i_maxDepth = -1 ) const;
85     // ACCESS
Set_RelatedNameRoom(relative_id i_nNameRoomId)86     void                Set_RelatedNameRoom(
87                             relative_id         i_nNameRoomId )
88                                                 { nNameRoomId = i_nNameRoomId; }
Parent()89     Node *              Parent()                { return pParent; }
Child(const String & i_name)90     Node *              Child(
91                             const String &      i_name )
92                                                 { return find_Child(i_name); }
Children()93     List &              Children()              { return aChildren; }
94 
95     /// @return a reference to a Node with Depth() == -1.
96     static Node &       Null_();
97 
98   private:
99     // Local
100                         Node(
101                             const String &      i_name,
102                             Node &              i_parent );
103 
104     Node *              find_Child(
105                             const String &      i_name );
106     Node &              add_Child(
107                             const String &      i_name );
108     Node &              provide_Child(
109                             StringVector::const_iterator
110                                                 i_next,
111                             StringVector::const_iterator
112                                                 i_end );
113     // Data
114     String              sName;
115     Node *              pParent;
116     List                aChildren;
117     intt                nDepth;
118     relative_id         nNameRoomId;
119 };
120 
121 
122 
123 
124 }   // namespace output
125 #endif
126