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 #include <precomp.h> 23 #include <ary/cpp/c_namesp.hxx> 24 25 26 // NOT FULLY DECLARED SERVICES 27 #include <algorithm> 28 #include <cosv/tpl/tpltools.hxx> 29 #include <ary/cpp/c_funct.hxx> 30 #include <ary/cpp/c_gate.hxx> 31 #include <ary/getncast.hxx> 32 #include <slots.hxx> 33 #include "c_slots.hxx" 34 35 36 namespace ary 37 { 38 namespace cpp 39 { 40 41 typedef std::multimap<String, Ce_id>::const_iterator operations_citer; 42 43 Namespace::Namespace() 44 : aEssentials(), 45 aAssignedNode(), 46 // aLocalNamespaces, 47 // aLocalClasses, 48 // aLocalEnums, 49 // aLocalTypedefs, 50 // aLocalOperations, 51 // aLocalVariables, 52 // aLocalConstants, 53 pParent(0), 54 nDepth(0) 55 { 56 aAssignedNode.Assign_Entity(*this); 57 } 58 59 Namespace::Namespace( const String & i_sLocalName, 60 Namespace & i_rParent ) 61 : aEssentials( i_sLocalName, 62 i_rParent.CeId(), 63 Lid(0) ), 64 aAssignedNode(), 65 // aLocalNamespaces, 66 // aLocalClasses, 67 // aLocalEnums, 68 // aLocalTypedefs, 69 // aLocalOperations, 70 // aLocalVariables, 71 // aLocalConstants, 72 pParent(&i_rParent), 73 nDepth(i_rParent.Depth()+1) 74 { 75 aAssignedNode.Assign_Entity(*this); 76 } 77 78 Namespace::~Namespace() 79 { 80 } 81 82 void 83 Namespace::Add_LocalNamespace( DYN Namespace & io_rLocalNamespace ) 84 { 85 aLocalNamespaces[io_rLocalNamespace.LocalName()] = &io_rLocalNamespace; 86 } 87 88 void 89 Namespace::Add_LocalClass( const String & i_sLocalName, 90 Cid i_nId ) 91 { 92 aLocalClasses[i_sLocalName] = i_nId; 93 } 94 95 void 96 Namespace::Add_LocalEnum( const String & i_sLocalName, 97 Cid i_nId ) 98 { 99 aLocalEnums[i_sLocalName] = i_nId; 100 } 101 102 void 103 Namespace::Add_LocalTypedef( const String & i_sLocalName, 104 Cid i_nId ) 105 { 106 aLocalTypedefs[i_sLocalName] = i_nId; 107 } 108 109 void 110 Namespace::Add_LocalOperation( const String & i_sLocalName, 111 Cid i_nId ) 112 { 113 aLocalOperations.insert( Map_Operations::value_type(i_sLocalName, i_nId) ); 114 } 115 116 117 void 118 Namespace::Add_LocalVariable( const String & i_sLocalName, 119 Cid i_nId ) 120 { 121 aLocalVariables[i_sLocalName] = i_nId; 122 } 123 124 void 125 Namespace::Add_LocalConstant( const String & i_sLocalName, 126 Cid i_nId ) 127 { 128 aLocalConstants[i_sLocalName] = i_nId; 129 } 130 131 uintt 132 Namespace::Depth() const 133 { 134 return nDepth; 135 } 136 137 Namespace * 138 Namespace::Parent() const 139 { 140 return pParent; 141 } 142 143 Ce_id 144 Namespace::Search_Child(const String & i_key) const 145 { 146 Namespace * 147 ret_nsp = Search_LocalNamespace(i_key); 148 if (ret_nsp != 0) 149 return ret_nsp->CeId(); 150 151 Ce_id 152 ret = Search_LocalClass(i_key); 153 if (ret.IsValid()) 154 return ret; 155 156 ret = csv::value_from_map(aLocalEnums, i_key, Ce_id(0)); 157 if (ret.IsValid()) 158 return ret; 159 ret = csv::value_from_map(aLocalTypedefs, i_key, Ce_id(0)); 160 if (ret.IsValid()) 161 return ret; 162 ret = csv::value_from_map(aLocalVariables, i_key, Ce_id(0)); 163 if (ret.IsValid()) 164 return ret; 165 return csv::value_from_map(aLocalConstants, i_key, Ce_id(0)); 166 } 167 168 Namespace * 169 Namespace::Search_LocalNamespace( const String & i_sLocalName ) const 170 { 171 return csv::value_from_map(aLocalNamespaces, i_sLocalName, (Namespace*)(0)); 172 } 173 174 uintt 175 Namespace::Get_SubNamespaces( std::vector< const Namespace* > & o_rResultList ) const 176 { 177 for ( Map_NamespacePtr::const_iterator it = aLocalNamespaces.begin(); 178 it != aLocalNamespaces.end(); 179 ++it ) 180 { 181 o_rResultList.push_back( (*it).second ); 182 } 183 return o_rResultList.size(); 184 } 185 186 Ce_id 187 Namespace::Search_LocalClass( const String & i_sName ) const 188 { 189 return csv::value_from_map(aLocalClasses, i_sName, Ce_id(0)); 190 } 191 192 void 193 Namespace::Search_LocalOperations( std::vector<Ce_id> & o_result, 194 const String & i_sName ) const 195 { 196 operations_citer 197 itLower = aLocalOperations.lower_bound(i_sName); 198 if (itLower == aLocalOperations.end()) 199 return; 200 if ( (*itLower).first != i_sName ) 201 return; 202 203 operations_citer 204 itEnd = aLocalOperations.end(); 205 for ( operations_citer it = itLower; 206 it != aLocalOperations.end() ? (*itLower).first == i_sName : false; 207 ++it ) 208 { 209 o_result.push_back((*it).second); 210 } 211 } 212 213 214 const String & 215 Namespace::inq_LocalName() const 216 { 217 return aEssentials.LocalName(); 218 } 219 220 Cid 221 Namespace::inq_Owner() const 222 { 223 return aEssentials.Owner(); 224 } 225 226 Lid 227 Namespace::inq_Location() const 228 { 229 return Lid(0); 230 } 231 232 void 233 Namespace::do_Accept(csv::ProcessorIfc & io_processor) const 234 { 235 csv::CheckedCall(io_processor,*this); 236 } 237 238 ClassId 239 Namespace::get_AryClass() const 240 { 241 return class_id; 242 } 243 244 Gid 245 Namespace::inq_Id_Group() const 246 { 247 return static_cast<Gid>(Id()); 248 } 249 250 const ary::cpp::CppEntity & 251 Namespace::inq_RE_Group() const 252 { 253 return *this; 254 } 255 256 const ary::group::SlotList & 257 Namespace::inq_Slots() const 258 { 259 static const SlotAccessId aProjectSlotData[] 260 = { SLOT_SubNamespaces, SLOT_Classes, SLOT_Enums, SLOT_Typedefs, SLOT_Operations, 261 SLOT_Variables, SLOT_Constants }; 262 static const std::vector< SlotAccessId > 263 aSlots( &aProjectSlotData[0], 264 &aProjectSlotData[0] 265 + sizeof aProjectSlotData / sizeof (SlotAccessId) ); 266 return aSlots; 267 } 268 269 DYN Slot * 270 Namespace::inq_Create_Slot( SlotAccessId i_nSlot ) const 271 { 272 switch ( i_nSlot ) 273 { 274 case SLOT_SubNamespaces: return new Slot_SubNamespaces(aLocalNamespaces); 275 case SLOT_Classes: return new Slot_MapLocalCe(aLocalClasses); 276 case SLOT_Enums: return new Slot_MapLocalCe(aLocalEnums); 277 case SLOT_Typedefs: return new Slot_MapLocalCe(aLocalTypedefs); 278 case SLOT_Operations: return new Slot_MapOperations(aLocalOperations); 279 case SLOT_Variables: return new Slot_MapLocalCe(aLocalVariables); 280 case SLOT_Constants: return new Slot_MapLocalCe(aLocalConstants); 281 default: 282 return new Slot_Null; 283 } // end switch 284 } 285 286 287 } // namespace cpp 288 } // namespace ary 289