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