Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <precomp.h>
21 : #include "ia_ce.hxx"
22 :
23 :
24 : // NOT FULLY DEFINED SERVICES
25 : #include <algorithm>
26 : #include <cosv/tpl/tpltools.hxx>
27 : #include <ary/idl/i_attribute.hxx>
28 : #include <ary/idl/i_constant.hxx>
29 : #include <ary/idl/i_constgroup.hxx>
30 : #include <ary/idl/i_enum.hxx>
31 : #include <ary/idl/i_enumvalue.hxx>
32 : #include <ary/idl/i_exception.hxx>
33 : #include <ary/idl/i_function.hxx>
34 : #include <ary/idl/i_interface.hxx>
35 : #include <ary/idl/i_module.hxx>
36 : #include <ary/idl/i_namelookup.hxx>
37 : #include <ary/idl/i_property.hxx>
38 : #include <ary/idl/i_service.hxx>
39 : #include <ary/idl/i_singleton.hxx>
40 : #include <ary/idl/i_siservice.hxx>
41 : #include <ary/idl/i_sisingleton.hxx>
42 : #include <ary/idl/i_struct.hxx>
43 : #include <ary/idl/i_structelem.hxx>
44 : #include <ary/idl/i_traits.hxx>
45 : #include <ary/idl/i_typedef.hxx>
46 : #include <idsort.hxx>
47 : #include "ia_type.hxx"
48 : #include "is_ce.hxx"
49 : #include "it_tplparam.hxx"
50 :
51 :
52 :
53 :
54 : namespace ary
55 : {
56 : namespace idl
57 : {
58 :
59 : inline Module &
60 39451 : CeAdmin::lhf_Access_Module( Ce_id i_nId )
61 39451 : { return ary_cast<Module>(Storage()[i_nId]); }
62 :
63 : inline void
64 19526 : CeAdmin::lhf_Put2Storage_and_AssignId( CodeEntity & pass_io_rCe )
65 : { // This also assigns an ID to pass_io_rCe:
66 19526 : Storage().Store_Entity(pass_io_rCe);
67 19526 : my_NameDictionary().Add_Name( pass_io_rCe.LocalName(),
68 : pass_io_rCe.CeId(),
69 : pass_io_rCe.AryClass(),
70 39052 : pass_io_rCe.Owner() );
71 19526 : }
72 :
73 : inline void
74 4252 : CeAdmin::lhf_Store_NewEntity( DYN CodeEntity & pass_io_rCe,
75 : Module & i_rOwner )
76 : {
77 4252 : lhf_Put2Storage_and_AssignId(pass_io_rCe);
78 4252 : i_rOwner.Add_Name(pass_io_rCe.LocalName(), pass_io_rCe.CeId());
79 4252 : }
80 :
81 : inline void
82 4134 : CeAdmin::lhf_Store_NewEntity( DYN CodeEntity & pass_io_rCe,
83 : Ce_id i_nOwnerModule )
84 : {
85 4134 : lhf_Store_NewEntity(pass_io_rCe, lhf_Access_Module(i_nOwnerModule));
86 4134 : }
87 :
88 :
89 :
90 1 : CeAdmin::CeAdmin( NameLookup & io_rNameDictionary,
91 : TypeAdmin & io_rTypePilot )
92 1 : : pStorage(new Ce_Storage),
93 : pGlobalNamespace(0),
94 : pNameDictionary(&io_rNameDictionary),
95 2 : pTypePilot(&io_rTypePilot)
96 : {
97 1 : Storage().Set_Reserved(
98 : predefined::ce_GlobalNamespace,
99 2 : *new Module );
100 1 : pGlobalNamespace = &lhf_Access_Module(Ce_id(predefined::ce_GlobalNamespace));
101 1 : }
102 :
103 2 : CeAdmin::~CeAdmin()
104 : {
105 2 : }
106 :
107 :
108 :
109 : Module &
110 17717 : CeAdmin::CheckIn_Module( Ce_id i_nParentId,
111 : const String & i_sName )
112 : {
113 17717 : Module & rOwner = lhf_Access_Module(i_nParentId);
114 17717 : Ce_id nId = rOwner.Search_Name(i_sName);
115 17717 : if (nId.IsValid())
116 : {
117 17599 : return lhf_Access_Module(nId);
118 : }
119 :
120 : Module & ret = *new Module( i_sName,
121 118 : rOwner );
122 118 : lhf_Store_NewEntity(ret, rOwner);
123 118 : return ret;
124 : }
125 :
126 : Service &
127 1075 : CeAdmin::Store_Service( Ce_id i_nOwner,
128 : const String & i_sName )
129 : {
130 : Service & ret = *new Service( i_sName,
131 1075 : i_nOwner );
132 1075 : lhf_Store_NewEntity(ret, i_nOwner);
133 1075 : return ret;
134 : }
135 :
136 : SglIfcService &
137 221 : CeAdmin::Store_SglIfcService( Ce_id i_nOwner,
138 : const String & i_sName,
139 : Type_id i_nBaseInterface )
140 : {
141 : SglIfcService &
142 : ret = *new SglIfcService( i_sName,
143 : i_nOwner,
144 221 : i_nBaseInterface );
145 221 : lhf_Store_NewEntity(ret, i_nOwner);
146 221 : return ret;
147 : }
148 :
149 : Interface &
150 1644 : CeAdmin::Store_Interface( Ce_id i_nOwner,
151 : const String & i_sName,
152 : Type_id i_nBase )
153 : {
154 : Interface & ret = *new Interface( i_sName,
155 1644 : i_nOwner );
156 1644 : lhf_Store_NewEntity(ret, i_nOwner);
157 1644 : if (i_nBase.IsValid())
158 1413 : ret.Add_Base(i_nBase, 0);
159 1644 : return ret;
160 : }
161 :
162 : Struct &
163 381 : CeAdmin::Store_Struct( Ce_id i_nOwner,
164 : const String & i_sName,
165 : Type_id i_nBase,
166 : const String & i_sTemplateParam )
167 : {
168 381 : if (NOT i_sTemplateParam.empty())
169 : {
170 : return lhf_Store_TplStruct( i_nOwner,
171 : i_sName,
172 : i_nBase,
173 3 : i_sTemplateParam );
174 : }
175 :
176 : Struct & ret = *new Struct( i_sName,
177 : i_nOwner,
178 : i_nBase,
179 : String::Null_(),
180 378 : Type_id::Null_() );
181 378 : lhf_Store_NewEntity(ret, i_nOwner);
182 :
183 378 : return ret;
184 : }
185 :
186 : Exception &
187 243 : CeAdmin::Store_Exception( Ce_id i_nOwner,
188 : const String & i_sName,
189 : Type_id i_nBase )
190 : {
191 : Exception & ret = *new Exception( i_sName,
192 : i_nOwner,
193 243 : i_nBase );
194 243 : lhf_Store_NewEntity(ret, i_nOwner);
195 243 : return ret;
196 : }
197 :
198 : Enum &
199 190 : CeAdmin::Store_Enum( Ce_id i_nOwner,
200 : const String & i_sName )
201 : {
202 : Enum & ret = *new Enum( i_sName,
203 190 : i_nOwner );
204 190 : lhf_Store_NewEntity(ret, i_nOwner);
205 190 : return ret;
206 : }
207 :
208 : Typedef &
209 18 : CeAdmin::Store_Typedef( Ce_id i_nOwner,
210 : const String & i_sName,
211 : Type_id i_nDefiningType )
212 : {
213 : Typedef & ret = *new Typedef( i_sName,
214 : i_nOwner,
215 18 : i_nDefiningType );
216 18 : lhf_Store_NewEntity(ret, i_nOwner);
217 18 : return ret;
218 : }
219 :
220 :
221 : ConstantsGroup &
222 347 : CeAdmin::Store_ConstantsGroup( Ce_id i_nOwner,
223 : const String & i_sName )
224 : {
225 : ConstantsGroup & ret = *new ConstantsGroup( i_sName,
226 347 : i_nOwner );
227 347 : lhf_Store_NewEntity(ret, i_nOwner);
228 347 : return ret;
229 : }
230 :
231 : Singleton &
232 4 : CeAdmin::Store_Singleton( Ce_id i_nOwner,
233 : const String & i_sName )
234 : {
235 : Singleton & ret = *new Singleton( i_sName,
236 4 : i_nOwner );
237 4 : lhf_Store_NewEntity(ret, i_nOwner);
238 4 : return ret;
239 : }
240 :
241 : SglIfcSingleton &
242 11 : CeAdmin::Store_SglIfcSingleton( Ce_id i_nOwner,
243 : const String & i_sName,
244 : Type_id i_nBaseInterface )
245 : {
246 : SglIfcSingleton &
247 : ret = *new SglIfcSingleton( i_sName,
248 : i_nOwner,
249 11 : i_nBaseInterface );
250 11 : lhf_Store_NewEntity(ret, i_nOwner);
251 11 : return ret;
252 : }
253 :
254 : Constant &
255 3220 : CeAdmin::Store_Constant( Ce_id i_nOwner,
256 : const String & i_sName,
257 : Type_id i_nType,
258 : const String & i_sValue )
259 : {
260 : ConstantsGroup &
261 3220 : rOwner = ary_cast<ConstantsGroup>(Storage()[i_nOwner]);
262 : Constant & ret = *new Constant( i_sName,
263 : i_nOwner,
264 3220 : rOwner.NameRoom(),
265 : i_nType,
266 6440 : i_sValue );
267 3220 : lhf_Put2Storage_and_AssignId(ret);
268 3220 : rOwner.Add_Constant(ret.CeId());
269 3220 : return ret;
270 : }
271 :
272 : Property &
273 3166 : CeAdmin::Store_Property( Ce_id i_nOwner,
274 : const String & i_sName,
275 : Type_id i_nType,
276 : Property::Stereotypes i_stereotypes )
277 : {
278 : Service &
279 3166 : rOwner = ary_cast<Service>(Storage()[i_nOwner]);
280 : Property & ret = *new Property( i_sName,
281 : i_nOwner,
282 3166 : rOwner.NameRoom(),
283 : i_nType,
284 6332 : i_stereotypes );
285 3166 : lhf_Put2Storage_and_AssignId(ret);
286 3166 : rOwner.Add_Property(ret.CeId());
287 3166 : return ret;
288 : }
289 :
290 : Function &
291 5502 : CeAdmin::Store_Function( Ce_id i_nOwner,
292 : const String & i_sName,
293 : Type_id i_nReturnType,
294 : bool i_bOneWay )
295 : {
296 : Interface &
297 5502 : rOwner = ary_cast<Interface>(Storage()[i_nOwner]);
298 : Function & ret = *new Function( i_sName,
299 : i_nOwner,
300 5502 : rOwner.NameRoom(),
301 : i_nReturnType,
302 11004 : i_bOneWay);
303 5502 : lhf_Put2Storage_and_AssignId(ret);
304 5502 : rOwner.Add_Function(ret.CeId());
305 5502 : return ret;
306 : }
307 :
308 : Function &
309 93 : CeAdmin::Store_ServiceConstructor( Ce_id i_nOwner,
310 : const String & i_sName )
311 : {
312 : SglIfcService &
313 93 : rOwner = ary_cast<SglIfcService>(Storage()[i_nOwner]);
314 : Function & ret = *new Function( i_sName,
315 : i_nOwner,
316 93 : rOwner.NameRoom() );
317 93 : lhf_Put2Storage_and_AssignId(ret);
318 93 : rOwner.Add_Constructor(ret.CeId());
319 93 : return ret;
320 : }
321 :
322 : StructElement &
323 1331 : CeAdmin::Store_StructMember( Ce_id i_nOwner,
324 : const String & i_sName,
325 : Type_id i_nType )
326 : {
327 : Struct &
328 1331 : rOwner = ary_cast<Struct>(Storage()[i_nOwner]);
329 : StructElement & ret = *new StructElement( i_sName,
330 : i_nOwner,
331 1331 : rOwner.NameRoom(),
332 2662 : i_nType );
333 1331 : lhf_Put2Storage_and_AssignId(ret);
334 1331 : rOwner.Add_Member(ret.CeId());
335 1331 : return ret;
336 : }
337 :
338 : StructElement &
339 152 : CeAdmin::Store_ExceptionMember( Ce_id i_nOwner,
340 : const String & i_sName,
341 : Type_id i_nType )
342 : {
343 : Exception &
344 152 : rOwner = ary_cast<Exception>(Storage()[i_nOwner]);
345 : StructElement & ret = *new StructElement( i_sName,
346 : i_nOwner,
347 152 : rOwner.NameRoom(),
348 304 : i_nType );
349 152 : lhf_Put2Storage_and_AssignId(ret);
350 152 : rOwner.Add_Member(ret.CeId());
351 152 : return ret;
352 : }
353 :
354 : EnumValue &
355 1297 : CeAdmin::Store_EnumValue( Ce_id i_nOwner,
356 : const String & i_sName,
357 : const String & i_sValue )
358 : {
359 : Enum &
360 1297 : rOwner = ary_cast<Enum>(Storage()[i_nOwner]);
361 : EnumValue & ret = *new EnumValue( i_sName,
362 : i_nOwner,
363 1297 : rOwner.NameRoom(),
364 2594 : i_sValue );
365 1297 : lhf_Put2Storage_and_AssignId(ret);
366 1297 : rOwner.Add_Value(ret.CeId());
367 1297 : return ret;
368 : }
369 :
370 : Attribute &
371 513 : CeAdmin::Store_Attribute( Ce_id i_nOwner,
372 : const String & i_sName,
373 : Type_id i_nType,
374 : bool i_bReadOnly,
375 : bool i_bBound )
376 : {
377 : Interface &
378 513 : rOwner = ary_cast<Interface>(Storage()[i_nOwner]);
379 :
380 : Attribute & ret = *new Attribute ( i_sName,
381 : i_nOwner,
382 513 : rOwner.NameRoom(),
383 : i_nType,
384 : i_bReadOnly,
385 1026 : i_bBound );
386 513 : lhf_Put2Storage_and_AssignId(ret);
387 513 : rOwner.Add_Attribute(ret.CeId());
388 513 : return ret;
389 : }
390 :
391 : const Module &
392 3084 : CeAdmin::GlobalNamespace() const
393 : {
394 : csv_assert(pGlobalNamespace);
395 3084 : return *pGlobalNamespace;
396 : }
397 :
398 : const CodeEntity &
399 122386 : CeAdmin::Find_Ce( Ce_id i_nId ) const
400 : {
401 122386 : return Storage()[i_nId];
402 :
403 : }
404 :
405 : const Module &
406 27876 : CeAdmin::Find_Module( Ce_id i_nId ) const
407 : {
408 27876 : return ary_cast<Module>(Storage()[i_nId]);
409 : }
410 :
411 : const Module *
412 14075 : CeAdmin::Search_Module( Ce_id i_nId ) const
413 : {
414 14075 : if (NOT i_nId.IsValid())
415 282 : return 0;
416 13793 : return ary_cast<Module>( & Storage()[i_nId] );
417 : }
418 :
419 : const Function &
420 0 : CeAdmin::Find_Function( Ce_id i_nId ) const
421 : {
422 0 : return ary_cast<Function>(Storage()[i_nId]);
423 : }
424 :
425 : const Property &
426 0 : CeAdmin::Find_Property( Ce_id i_nId ) const
427 : {
428 0 : return ary_cast<Property>(Storage()[i_nId]);
429 : }
430 :
431 : const EnumValue &
432 0 : CeAdmin::Find_EnumValue( Ce_id i_nId ) const
433 : {
434 0 : return ary_cast<EnumValue>(Storage()[i_nId]);
435 : }
436 :
437 : const Constant &
438 0 : CeAdmin::Find_Constant( Ce_id i_nId ) const
439 : {
440 0 : return ary_cast<Constant>(Storage()[i_nId]);
441 : }
442 :
443 : const StructElement &
444 0 : CeAdmin::Find_StructElement( Ce_id i_nId ) const
445 : {
446 0 : return ary_cast<StructElement>(Storage()[i_nId]);
447 : }
448 :
449 : void
450 87757 : CeAdmin::Get_Text( StringVector & o_module,
451 : String & o_ce,
452 : String & o_member,
453 : const CodeEntity & i_ce ) const
454 : {
455 87757 : const CodeEntity * pCe = &i_ce;
456 87757 : csv::erase_container(o_module);
457 87757 : o_ce.clear();
458 87757 : o_member.clear();
459 :
460 87757 : switch ( pCe->SightLevel() )
461 : {
462 : // Here are intentionally no breaks!
463 : case sl_Member:
464 22021 : if ( is_type<Function>(*pCe) )
465 22994 : o_member = StreamLock(200)()
466 22994 : << pCe->LocalName()
467 11497 : << "()"
468 11497 : << c_str;
469 : else
470 10524 : o_member = pCe->LocalName();
471 22021 : pCe = & Storage()[pCe->Owner()];
472 : case sl_File:
473 82378 : o_ce = pCe->LocalName();
474 82378 : pCe = & Storage()[pCe->NameRoom()];
475 : case sl_Module:
476 87757 : get_ModuleText(o_module,*pCe);
477 87757 : break;
478 : default:
479 : csv_assert(false);
480 : } // end switch
481 87757 : }
482 :
483 : const NameLookup &
484 0 : CeAdmin::NameDictionary() const
485 : {
486 0 : return *pNameDictionary;
487 : }
488 :
489 :
490 : void
491 27 : CeAdmin::Get_AlphabeticalIndex( std::vector<Ce_id> & o_rResult,
492 : alphabetical_index::E_Letter i_cLetter ) const
493 : {
494 27 : const int C_nLowerUpperDiff = 'a'-'A';
495 :
496 : // Establishing filter:
497 : UINT8 filter[256];
498 :
499 27 : UINT8 nLetter = static_cast<UINT8>(i_cLetter);
500 27 : memset(filter, 0, 256);
501 27 : filter[nLetter] = 1;
502 27 : if ( i_cLetter != alphabetical_index::non_alpha )
503 26 : filter[nLetter - C_nLowerUpperDiff] = 1;
504 :
505 : // Gather entities which start with i_cLetter:
506 27 : o_rResult.reserve(1000);
507 : idl::Ce_Storage::c_iter
508 27 : itEnd = Storage().End();
509 1581687 : for ( idl::Ce_Storage::c_iter it = Storage().BeginUnreserved();
510 1054458 : it != itEnd;
511 : ++it )
512 : {
513 527202 : if ( filter[ static_cast<UINT8>(*(*it).LocalName().c_str()) ] == 1 )
514 19526 : o_rResult.push_back( (*it).CeId() );
515 27 : }
516 :
517 : std::sort( o_rResult.begin(),
518 : o_rResult.end(),
519 27 : IdSorter<Ce_Compare>() );
520 27 : }
521 :
522 :
523 : Module &
524 4 : CeAdmin::GlobalNamespace()
525 : {
526 : csv_assert(pGlobalNamespace);
527 4 : return *pGlobalNamespace;
528 : }
529 :
530 : CodeEntity &
531 3 : CeAdmin::Find_Ce( Ce_id i_nId )
532 : {
533 3 : return Storage()[i_nId];
534 : }
535 :
536 : void
537 451811 : CeAdmin::get_ModuleText( StringVector & o_module,
538 : const CodeEntity & i_ce ) const
539 : {
540 451811 : if (i_ce.NameRoom().IsValid())
541 : {
542 : const CodeEntity &
543 364054 : rParent = Storage()[i_ce.NameRoom()];
544 364054 : get_ModuleText(o_module, rParent);
545 364054 : o_module.push_back(i_ce.LocalName());
546 : }
547 451811 : }
548 :
549 : Struct &
550 3 : CeAdmin::lhf_Store_TplStruct( Ce_id i_nOwner,
551 : const String & i_sName,
552 : Type_id i_nBase,
553 : const String & i_sTemplateParam )
554 : {
555 : csv_assert(NOT i_sTemplateParam.empty());
556 :
557 : TemplateParamType &
558 3 : rTpt = pTypePilot->Store_TemplateParamType(i_sTemplateParam);
559 :
560 : Struct & ret = *new Struct( i_sName,
561 : i_nOwner,
562 : i_nBase,
563 : i_sTemplateParam,
564 3 : rTpt.TypeId() );
565 3 : lhf_Store_NewEntity(ret, i_nOwner);
566 3 : rTpt.Set_StructId(ret.CeId());
567 :
568 3 : return ret;
569 : }
570 :
571 :
572 : } // namespace idl
573 3 : } // namespace ary
574 :
575 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|