1*d291ea28SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*d291ea28SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*d291ea28SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*d291ea28SAndrew Rist * distributed with this work for additional information 6*d291ea28SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*d291ea28SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*d291ea28SAndrew Rist * "License"); you may not use this file except in compliance 9*d291ea28SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*d291ea28SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*d291ea28SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*d291ea28SAndrew Rist * software distributed under the License is distributed on an 15*d291ea28SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*d291ea28SAndrew Rist * KIND, either express or implied. See the License for the 17*d291ea28SAndrew Rist * specific language governing permissions and limitations 18*d291ea28SAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*d291ea28SAndrew Rist *************************************************************/ 21cdf0e10cSrcweir 22cdf0e10cSrcweir #include <precomp.h> 23cdf0e10cSrcweir #include <ary/cpp/c_class.hxx> 24cdf0e10cSrcweir 25cdf0e10cSrcweir 26cdf0e10cSrcweir // NOT FULLY DECLARED SERVICES 27cdf0e10cSrcweir #include <slots.hxx> 28cdf0e10cSrcweir #include "c_slots.hxx" 29cdf0e10cSrcweir 30cdf0e10cSrcweir 31cdf0e10cSrcweir 32cdf0e10cSrcweir namespace ary 33cdf0e10cSrcweir { 34cdf0e10cSrcweir namespace cpp 35cdf0e10cSrcweir { 36cdf0e10cSrcweir 37cdf0e10cSrcweir Class::Class( const String & i_sLocalName, 38cdf0e10cSrcweir Ce_id i_nOwner, 39cdf0e10cSrcweir E_Protection i_eProtection, 40cdf0e10cSrcweir loc::Le_id i_nFile, 41cdf0e10cSrcweir E_ClassKey i_eClassKey ) 42cdf0e10cSrcweir : aEssentials( i_sLocalName, 43cdf0e10cSrcweir i_nOwner, 44cdf0e10cSrcweir i_nFile ), 45cdf0e10cSrcweir aAssignedNode(), 46cdf0e10cSrcweir aBaseClasses(), 47cdf0e10cSrcweir aTemplateParameterTypes(), 48cdf0e10cSrcweir aClasses(), 49cdf0e10cSrcweir aEnums(), 50cdf0e10cSrcweir aTypedefs(), 51cdf0e10cSrcweir aOperations(), 52cdf0e10cSrcweir aStaticOperations(), 53cdf0e10cSrcweir aData(), 54cdf0e10cSrcweir aStaticData(), 55cdf0e10cSrcweir aFriendClasses(), 56cdf0e10cSrcweir aFriendOperations(), 57cdf0e10cSrcweir aKnownDerivatives(), 58cdf0e10cSrcweir eClassKey(i_eClassKey), 59cdf0e10cSrcweir eProtection(i_eProtection), 60cdf0e10cSrcweir eVirtuality(VIRTUAL_none) 61cdf0e10cSrcweir { 62cdf0e10cSrcweir aAssignedNode.Assign_Entity(*this); 63cdf0e10cSrcweir } 64cdf0e10cSrcweir 65cdf0e10cSrcweir Class::~Class() 66cdf0e10cSrcweir { 67cdf0e10cSrcweir } 68cdf0e10cSrcweir 69cdf0e10cSrcweir void 70cdf0e10cSrcweir Class::Add_BaseClass( const S_Classes_Base & i_rBaseClass ) 71cdf0e10cSrcweir { 72cdf0e10cSrcweir aBaseClasses.push_back(i_rBaseClass); 73cdf0e10cSrcweir } 74cdf0e10cSrcweir 75cdf0e10cSrcweir void 76cdf0e10cSrcweir Class::Add_TemplateParameterType( const String & i_sLocalName, 77cdf0e10cSrcweir Type_id i_nIdAsType ) 78cdf0e10cSrcweir { 79cdf0e10cSrcweir aTemplateParameterTypes.push_back( 80cdf0e10cSrcweir List_TplParam::value_type(i_sLocalName,i_nIdAsType) ); 81cdf0e10cSrcweir } 82cdf0e10cSrcweir 83cdf0e10cSrcweir void 84cdf0e10cSrcweir Class::Add_LocalClass( const String & i_sLocalName, 85cdf0e10cSrcweir Cid i_nId ) 86cdf0e10cSrcweir { 87cdf0e10cSrcweir aClasses.push_back( S_LocalCe(i_sLocalName, i_nId) ); 88cdf0e10cSrcweir } 89cdf0e10cSrcweir 90cdf0e10cSrcweir void 91cdf0e10cSrcweir Class::Add_LocalEnum( const String & i_sLocalName, 92cdf0e10cSrcweir Cid i_nId ) 93cdf0e10cSrcweir { 94cdf0e10cSrcweir aEnums.push_back( S_LocalCe(i_sLocalName, i_nId) ); 95cdf0e10cSrcweir } 96cdf0e10cSrcweir 97cdf0e10cSrcweir void 98cdf0e10cSrcweir Class::Add_LocalTypedef( const String & i_sLocalName, 99cdf0e10cSrcweir Cid i_nId ) 100cdf0e10cSrcweir { 101cdf0e10cSrcweir aTypedefs.push_back( S_LocalCe(i_sLocalName, i_nId) ); 102cdf0e10cSrcweir } 103cdf0e10cSrcweir 104cdf0e10cSrcweir void 105cdf0e10cSrcweir Class::Add_LocalOperation( const String & i_sLocalName, 106cdf0e10cSrcweir Cid i_nId ) 107cdf0e10cSrcweir { 108cdf0e10cSrcweir aOperations.push_back( S_LocalCe(i_sLocalName, i_nId) ); 109cdf0e10cSrcweir } 110cdf0e10cSrcweir 111cdf0e10cSrcweir void 112cdf0e10cSrcweir Class::Add_LocalStaticOperation( const String & i_sLocalName, 113cdf0e10cSrcweir Cid i_nId ) 114cdf0e10cSrcweir { 115cdf0e10cSrcweir aStaticOperations.push_back( S_LocalCe(i_sLocalName, i_nId) ); 116cdf0e10cSrcweir } 117cdf0e10cSrcweir 118cdf0e10cSrcweir void 119cdf0e10cSrcweir Class::Add_LocalData( const String & i_sLocalName, 120cdf0e10cSrcweir Cid i_nId ) 121cdf0e10cSrcweir { 122cdf0e10cSrcweir aData.push_back( S_LocalCe(i_sLocalName, i_nId) ); 123cdf0e10cSrcweir } 124cdf0e10cSrcweir 125cdf0e10cSrcweir void 126cdf0e10cSrcweir Class::Add_LocalStaticData( const String & i_sLocalName, 127cdf0e10cSrcweir Cid i_nId ) 128cdf0e10cSrcweir { 129cdf0e10cSrcweir aStaticData.push_back( S_LocalCe(i_sLocalName, i_nId) ); 130cdf0e10cSrcweir } 131cdf0e10cSrcweir 132cdf0e10cSrcweir 133cdf0e10cSrcweir struct find_name 134cdf0e10cSrcweir { 135cdf0e10cSrcweir find_name( 136cdf0e10cSrcweir const String & i_name ) 137cdf0e10cSrcweir : sName(i_name) {} 138cdf0e10cSrcweir 139cdf0e10cSrcweir bool operator()( 140cdf0e10cSrcweir const S_LocalCe & i_lce ) const 141cdf0e10cSrcweir { return i_lce.sLocalName == sName; } 142cdf0e10cSrcweir private: 143cdf0e10cSrcweir String sName; 144cdf0e10cSrcweir }; 145cdf0e10cSrcweir 146cdf0e10cSrcweir Ce_id 147cdf0e10cSrcweir Class::Search_Child(const String & i_key) const 148cdf0e10cSrcweir { 149cdf0e10cSrcweir Ce_id 150cdf0e10cSrcweir ret = Ce_id(Search_LocalClass(i_key)); 151cdf0e10cSrcweir if (ret.IsValid()) 152cdf0e10cSrcweir return ret; 153cdf0e10cSrcweir 154cdf0e10cSrcweir CIterator_Locals 155cdf0e10cSrcweir itret = std::find_if(aEnums.begin(), aEnums.end(), find_name(i_key)); 156cdf0e10cSrcweir if (itret != aEnums.end()) 157cdf0e10cSrcweir return (*itret).nId; 158cdf0e10cSrcweir itret = std::find_if(aTypedefs.begin(), aTypedefs.end(), find_name(i_key)); 159cdf0e10cSrcweir if (itret != aTypedefs.end()) 160cdf0e10cSrcweir return (*itret).nId; 161cdf0e10cSrcweir itret = std::find_if(aData.begin(), aData.end(), find_name(i_key)); 162cdf0e10cSrcweir if (itret != aData.end()) 163cdf0e10cSrcweir return (*itret).nId; 164cdf0e10cSrcweir itret = std::find_if(aStaticData.begin(), aStaticData.end(), find_name(i_key)); 165cdf0e10cSrcweir if (itret != aStaticData.end()) 166cdf0e10cSrcweir return (*itret).nId; 167cdf0e10cSrcweir return Ce_id(0); 168cdf0e10cSrcweir } 169cdf0e10cSrcweir 170cdf0e10cSrcweir Rid 171cdf0e10cSrcweir Class::Search_LocalClass( const String & i_sName ) const 172cdf0e10cSrcweir { 173cdf0e10cSrcweir CIterator_Locals itFound = PosOfName(aClasses, i_sName); 174cdf0e10cSrcweir if (itFound != aClasses.end()) 175cdf0e10cSrcweir return (*itFound).nId.Value(); 176cdf0e10cSrcweir return 0; 177cdf0e10cSrcweir } 178cdf0e10cSrcweir 179cdf0e10cSrcweir const String & 180cdf0e10cSrcweir Class::inq_LocalName() const 181cdf0e10cSrcweir { 182cdf0e10cSrcweir return aEssentials.LocalName(); 183cdf0e10cSrcweir } 184cdf0e10cSrcweir 185cdf0e10cSrcweir Cid 186cdf0e10cSrcweir Class::inq_Owner() const 187cdf0e10cSrcweir { 188cdf0e10cSrcweir return aEssentials.Owner(); 189cdf0e10cSrcweir } 190cdf0e10cSrcweir 191cdf0e10cSrcweir loc::Le_id 192cdf0e10cSrcweir Class::inq_Location() const 193cdf0e10cSrcweir { 194cdf0e10cSrcweir return aEssentials.Location(); 195cdf0e10cSrcweir } 196cdf0e10cSrcweir 197cdf0e10cSrcweir void 198cdf0e10cSrcweir Class::do_Accept(csv::ProcessorIfc & io_processor) const 199cdf0e10cSrcweir { 200cdf0e10cSrcweir csv::CheckedCall(io_processor,*this); 201cdf0e10cSrcweir } 202cdf0e10cSrcweir 203cdf0e10cSrcweir ClassId 204cdf0e10cSrcweir Class::get_AryClass() const 205cdf0e10cSrcweir { 206cdf0e10cSrcweir return class_id; 207cdf0e10cSrcweir } 208cdf0e10cSrcweir 209cdf0e10cSrcweir Gid 210cdf0e10cSrcweir Class::inq_Id_Group() const 211cdf0e10cSrcweir { 212cdf0e10cSrcweir return static_cast<Gid>(Id()); 213cdf0e10cSrcweir } 214cdf0e10cSrcweir 215cdf0e10cSrcweir const ary::cpp::CppEntity & 216cdf0e10cSrcweir Class::inq_RE_Group() const 217cdf0e10cSrcweir { 218cdf0e10cSrcweir return *this; 219cdf0e10cSrcweir } 220cdf0e10cSrcweir 221cdf0e10cSrcweir const group::SlotList & 222cdf0e10cSrcweir Class::inq_Slots() const 223cdf0e10cSrcweir { 224cdf0e10cSrcweir static const SlotAccessId aProjectSlotData[] 225cdf0e10cSrcweir = { SLOT_Bases, 226cdf0e10cSrcweir SLOT_NestedClasses, 227cdf0e10cSrcweir SLOT_Enums, 228cdf0e10cSrcweir SLOT_Typedefs, 229cdf0e10cSrcweir SLOT_Operations, 230cdf0e10cSrcweir SLOT_StaticOperations, 231cdf0e10cSrcweir SLOT_Data, 232cdf0e10cSrcweir SLOT_StaticData, 233cdf0e10cSrcweir SLOT_FriendClasses, 234cdf0e10cSrcweir SLOT_FriendOperations }; 235cdf0e10cSrcweir static const std::vector< SlotAccessId > 236cdf0e10cSrcweir aSlots( &aProjectSlotData[0], 237cdf0e10cSrcweir &aProjectSlotData[0] 238cdf0e10cSrcweir + sizeof aProjectSlotData / sizeof (SlotAccessId) ); 239cdf0e10cSrcweir return aSlots; 240cdf0e10cSrcweir } 241cdf0e10cSrcweir 242cdf0e10cSrcweir 243cdf0e10cSrcweir DYN Slot * 244cdf0e10cSrcweir Class::inq_Create_Slot( SlotAccessId i_nSlot ) const 245cdf0e10cSrcweir { 246cdf0e10cSrcweir switch ( i_nSlot ) 247cdf0e10cSrcweir { 248cdf0e10cSrcweir case SLOT_Bases: return new Slot_BaseClass(aBaseClasses); 249cdf0e10cSrcweir case SLOT_NestedClasses: return new Slot_ListLocalCe(aClasses); 250cdf0e10cSrcweir case SLOT_Enums: return new Slot_ListLocalCe(aEnums); 251cdf0e10cSrcweir case SLOT_Typedefs: return new Slot_ListLocalCe(aTypedefs); 252cdf0e10cSrcweir case SLOT_Operations: return new Slot_ListLocalCe(aOperations); 253cdf0e10cSrcweir case SLOT_StaticOperations: return new Slot_ListLocalCe(aStaticOperations); 254cdf0e10cSrcweir case SLOT_Data: return new Slot_ListLocalCe(aData); 255cdf0e10cSrcweir case SLOT_StaticData: return new Slot_ListLocalCe(aStaticData); 256cdf0e10cSrcweir case SLOT_FriendClasses: return new Slot_SequentialIds<Ce_id>(aFriendClasses); 257cdf0e10cSrcweir case SLOT_FriendOperations: return new Slot_SequentialIds<Ce_id>(aFriendOperations); 258cdf0e10cSrcweir default: 259cdf0e10cSrcweir return new Slot_Null; 260cdf0e10cSrcweir } // end switch 261cdf0e10cSrcweir } 262cdf0e10cSrcweir 263cdf0e10cSrcweir Class::CIterator_Locals 264cdf0e10cSrcweir Class::PosOfName( const List_LocalCe & i_rList, 265cdf0e10cSrcweir const String & i_sName ) const 266cdf0e10cSrcweir { 267cdf0e10cSrcweir for ( CIterator_Locals ret = i_rList.begin(); 268cdf0e10cSrcweir ret != i_rList.end(); 269cdf0e10cSrcweir ++ret ) 270cdf0e10cSrcweir { 271cdf0e10cSrcweir if ( (*ret).sLocalName == i_sName ) 272cdf0e10cSrcweir return ret; 273cdf0e10cSrcweir } 274cdf0e10cSrcweir return i_rList.end(); 275cdf0e10cSrcweir } 276cdf0e10cSrcweir 277cdf0e10cSrcweir } // namespace cpp 278cdf0e10cSrcweir } // namespace ary 279