1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski #include <precomp.h>
23*b1cdbd2cSJim Jagielski #include <toolkit/out_node.hxx>
24*b1cdbd2cSJim Jagielski 
25*b1cdbd2cSJim Jagielski 
26*b1cdbd2cSJim Jagielski // NOT FULLY DEFINED SERVICES
27*b1cdbd2cSJim Jagielski #include <algorithm>
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski namespace output
31*b1cdbd2cSJim Jagielski {
32*b1cdbd2cSJim Jagielski 
33*b1cdbd2cSJim Jagielski 
34*b1cdbd2cSJim Jagielski namespace
35*b1cdbd2cSJim Jagielski {
36*b1cdbd2cSJim Jagielski 
37*b1cdbd2cSJim Jagielski struct Less_NodePtr
38*b1cdbd2cSJim Jagielski {
operator ()output::__anon612f6cb50111::Less_NodePtr39*b1cdbd2cSJim Jagielski     bool                operator()(
40*b1cdbd2cSJim Jagielski                             Node *              p1,
41*b1cdbd2cSJim Jagielski                             Node *              p2 ) const
42*b1cdbd2cSJim Jagielski                         { return p1->Name() < p2->Name(); }
43*b1cdbd2cSJim Jagielski };
44*b1cdbd2cSJim Jagielski 
45*b1cdbd2cSJim Jagielski struct Less_NodePtr     C_Less_NodePtr;
46*b1cdbd2cSJim Jagielski 
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski Node  C_aNullNode(Node::null_object);
49*b1cdbd2cSJim Jagielski 
50*b1cdbd2cSJim Jagielski 
51*b1cdbd2cSJim Jagielski }   // namepace anonymous
52*b1cdbd2cSJim Jagielski 
53*b1cdbd2cSJim Jagielski 
54*b1cdbd2cSJim Jagielski //**********************        Node        ***************************//
55*b1cdbd2cSJim Jagielski 
56*b1cdbd2cSJim Jagielski 
Node()57*b1cdbd2cSJim Jagielski Node::Node()
58*b1cdbd2cSJim Jagielski     :   sName(),
59*b1cdbd2cSJim Jagielski   	    pParent(0),
60*b1cdbd2cSJim Jagielski   	    aChildren(),
61*b1cdbd2cSJim Jagielski   	    nDepth(0),
62*b1cdbd2cSJim Jagielski   	    nNameRoomId(0)
63*b1cdbd2cSJim Jagielski {
64*b1cdbd2cSJim Jagielski }
65*b1cdbd2cSJim Jagielski 
Node(E_NullObject)66*b1cdbd2cSJim Jagielski Node::Node( E_NullObject )
67*b1cdbd2cSJim Jagielski     :   sName(),
68*b1cdbd2cSJim Jagielski   	    pParent(0),
69*b1cdbd2cSJim Jagielski   	    aChildren(),
70*b1cdbd2cSJim Jagielski   	    nDepth(-1),
71*b1cdbd2cSJim Jagielski   	    nNameRoomId(0)
72*b1cdbd2cSJim Jagielski {
73*b1cdbd2cSJim Jagielski }
74*b1cdbd2cSJim Jagielski 
Node(const String & i_name,Node & i_parent)75*b1cdbd2cSJim Jagielski Node::Node( const String &  i_name,
76*b1cdbd2cSJim Jagielski             Node &          i_parent )
77*b1cdbd2cSJim Jagielski     :   sName(i_name),
78*b1cdbd2cSJim Jagielski         pParent(&i_parent),
79*b1cdbd2cSJim Jagielski         aChildren(),
80*b1cdbd2cSJim Jagielski         nDepth(i_parent.Depth()+1),
81*b1cdbd2cSJim Jagielski   	    nNameRoomId(0)
82*b1cdbd2cSJim Jagielski {
83*b1cdbd2cSJim Jagielski }
84*b1cdbd2cSJim Jagielski 
~Node()85*b1cdbd2cSJim Jagielski Node::~Node()
86*b1cdbd2cSJim Jagielski {
87*b1cdbd2cSJim Jagielski     for ( List::iterator it = aChildren.begin();
88*b1cdbd2cSJim Jagielski           it != aChildren.end();
89*b1cdbd2cSJim Jagielski           ++it )
90*b1cdbd2cSJim Jagielski     {
91*b1cdbd2cSJim Jagielski         delete *it;
92*b1cdbd2cSJim Jagielski     }
93*b1cdbd2cSJim Jagielski }
94*b1cdbd2cSJim Jagielski 
95*b1cdbd2cSJim Jagielski Node &
Provide_Child(const String & i_name)96*b1cdbd2cSJim Jagielski Node::Provide_Child( const String & i_name )
97*b1cdbd2cSJim Jagielski {
98*b1cdbd2cSJim Jagielski     Node *
99*b1cdbd2cSJim Jagielski         ret = find_Child(i_name);
100*b1cdbd2cSJim Jagielski     if (ret != 0)
101*b1cdbd2cSJim Jagielski         return *ret;
102*b1cdbd2cSJim Jagielski     return add_Child(i_name);
103*b1cdbd2cSJim Jagielski }
104*b1cdbd2cSJim Jagielski 
105*b1cdbd2cSJim Jagielski void
Get_Path(StreamStr & o_result,intt i_maxDepth) const106*b1cdbd2cSJim Jagielski Node::Get_Path( StreamStr &         o_result,
107*b1cdbd2cSJim Jagielski                 intt                i_maxDepth ) const
108*b1cdbd2cSJim Jagielski {
109*b1cdbd2cSJim Jagielski     // Intentionally 'i_maxDepth != 0', so max_Depth == -1 sets no limit:
110*b1cdbd2cSJim Jagielski     if (i_maxDepth != 0)
111*b1cdbd2cSJim Jagielski     {
112*b1cdbd2cSJim Jagielski         if (pParent != 0)
113*b1cdbd2cSJim Jagielski             pParent->Get_Path(o_result, i_maxDepth-1);
114*b1cdbd2cSJim Jagielski         o_result << sName << '/';
115*b1cdbd2cSJim Jagielski     }
116*b1cdbd2cSJim Jagielski }
117*b1cdbd2cSJim Jagielski 
118*b1cdbd2cSJim Jagielski void
Get_Chain(StringVector & o_result,intt i_maxDepth) const119*b1cdbd2cSJim Jagielski Node::Get_Chain( StringVector & o_result,
120*b1cdbd2cSJim Jagielski 				 intt           i_maxDepth ) const
121*b1cdbd2cSJim Jagielski {
122*b1cdbd2cSJim Jagielski     if (i_maxDepth != 0)
123*b1cdbd2cSJim Jagielski     {
124*b1cdbd2cSJim Jagielski         // This is called also for the toplevel Node,
125*b1cdbd2cSJim Jagielski         //   but there happens nothing:
126*b1cdbd2cSJim Jagielski         if (pParent != 0)
127*b1cdbd2cSJim Jagielski         {
128*b1cdbd2cSJim Jagielski             pParent->Get_Chain(o_result, i_maxDepth-1);
129*b1cdbd2cSJim Jagielski             o_result.push_back(sName);
130*b1cdbd2cSJim Jagielski         }
131*b1cdbd2cSJim Jagielski     }
132*b1cdbd2cSJim Jagielski }
133*b1cdbd2cSJim Jagielski 
134*b1cdbd2cSJim Jagielski Node *
find_Child(const String & i_name)135*b1cdbd2cSJim Jagielski Node::find_Child( const String & i_name )
136*b1cdbd2cSJim Jagielski {
137*b1cdbd2cSJim Jagielski     Node aSearch;
138*b1cdbd2cSJim Jagielski     aSearch.sName = i_name;
139*b1cdbd2cSJim Jagielski 
140*b1cdbd2cSJim Jagielski     List::const_iterator
141*b1cdbd2cSJim Jagielski         ret = std::lower_bound( aChildren.begin(),
142*b1cdbd2cSJim Jagielski 							    aChildren.end(),
143*b1cdbd2cSJim Jagielski                                 &aSearch,
144*b1cdbd2cSJim Jagielski 						        C_Less_NodePtr );
145*b1cdbd2cSJim Jagielski     if ( ret != aChildren.end() ? (*ret)->Name() == i_name : false )
146*b1cdbd2cSJim Jagielski         return *ret;
147*b1cdbd2cSJim Jagielski 
148*b1cdbd2cSJim Jagielski     return 0;
149*b1cdbd2cSJim Jagielski }
150*b1cdbd2cSJim Jagielski 
151*b1cdbd2cSJim Jagielski Node &
add_Child(const String & i_name)152*b1cdbd2cSJim Jagielski Node::add_Child( const String & i_name )
153*b1cdbd2cSJim Jagielski {
154*b1cdbd2cSJim Jagielski     DYN Node *
155*b1cdbd2cSJim Jagielski         pNew = new Node(i_name,*this);
156*b1cdbd2cSJim Jagielski     aChildren.insert( std::lower_bound( aChildren.begin(),
157*b1cdbd2cSJim Jagielski 										aChildren.end(),
158*b1cdbd2cSJim Jagielski                                         pNew,
159*b1cdbd2cSJim Jagielski 										C_Less_NodePtr ),
160*b1cdbd2cSJim Jagielski 			          pNew );
161*b1cdbd2cSJim Jagielski     return *pNew;
162*b1cdbd2cSJim Jagielski }
163*b1cdbd2cSJim Jagielski 
164*b1cdbd2cSJim Jagielski Node &
provide_Child(StringVector::const_iterator i_next,StringVector::const_iterator i_end)165*b1cdbd2cSJim Jagielski Node::provide_Child( StringVector::const_iterator i_next,
166*b1cdbd2cSJim Jagielski   	                 StringVector::const_iterator i_end )
167*b1cdbd2cSJim Jagielski {
168*b1cdbd2cSJim Jagielski     if (i_next == i_end)
169*b1cdbd2cSJim Jagielski         return *this;
170*b1cdbd2cSJim Jagielski     return Provide_Child(*i_next).provide_Child(i_next+1,i_end);
171*b1cdbd2cSJim Jagielski }
172*b1cdbd2cSJim Jagielski 
173*b1cdbd2cSJim Jagielski 
174*b1cdbd2cSJim Jagielski 
175*b1cdbd2cSJim Jagielski 
176*b1cdbd2cSJim Jagielski Node &
Null_()177*b1cdbd2cSJim Jagielski Node::Null_()
178*b1cdbd2cSJim Jagielski {
179*b1cdbd2cSJim Jagielski     return C_aNullNode;
180*b1cdbd2cSJim Jagielski }
181*b1cdbd2cSJim Jagielski 
182*b1cdbd2cSJim Jagielski 
183*b1cdbd2cSJim Jagielski }   // namespace output
184