source: dev/trunk/ab5.0/abdev/ab_common/include/NamespaceSupporter.h@ 512

Last change on this file since 512 was 507, checked in by dai_9181, 17 years ago

NamespaceSupporterクラスをab_commonプロジェクトに移動した。

File size: 3.0 KB
Line 
1#pragma once
2
3namespace ActiveBasic{ namespace Common{ namespace Lexical{
4
5
6class NamespaceSupporter
7{
8 const NamespaceScopesCollection *allNamespaceScopesCollection;
9
10 // Importsされた名前空間
11 NamespaceScopesCollection importedNamespaces;
12
13 // 現在の名前空間
14 NamespaceScopes livingNamespaceScopes;
15
16public:
17 NamespaceSupporter()
18 : allNamespaceScopesCollection( NULL )
19 {
20 }
21
22 void RegistAllNamespaceScopesCollection( const NamespaceScopesCollection *allNamespaceScopesCollection )
23 {
24 this->allNamespaceScopesCollection = allNamespaceScopesCollection;
25 }
26
27 NamespaceScopesCollection &GetImportedNamespaces()
28 {
29 return importedNamespaces;
30 }
31 void SetImportedNamespaces( const NamespaceScopesCollection &namespaces )
32 {
33 this->importedNamespaces = namespaces;
34 }
35 bool ImportsNamespace( const NamespaceScopes &namespaceScopes );
36 bool ImportsNamespace( const std::string &namespaceStr );
37
38 NamespaceScopes &GetLivingNamespaceScopes()
39 {
40 return livingNamespaceScopes;
41 }
42 void SetLivingNamespaceScopes( const NamespaceScopes &namespaceScopes )
43 {
44 this->livingNamespaceScopes = namespaceScopes;
45 }
46 bool IsLiving( const NamespaceScopes &namespaceScopes ) const
47 {
48 return NamespaceScopes::IsBelong( namespaceScopes, livingNamespaceScopes );
49 }
50
51
52 // 包括しているかをチェック
53 // 例:
54 // this = "Discoversoft.ActiveBasic"
55 // living = "Discoversoft.ActiveBasic"
56 // entryName = "ActiveBasic"
57 // この場合、living は entryName を包括している。
58 bool IsCoverd( const NamespaceScopes &namespaceScopes, const std::string &entryName ) const
59 {
60 if( namespaceScopes.IsEqual( entryName ) )
61 {
62 return true;
63 }
64
65 std::string thisStr = namespaceScopes.ToString();
66
67 NamespaceScopes tempLivingNamespaceScopes = livingNamespaceScopes;
68
69 while( tempLivingNamespaceScopes.size() )
70 {
71 std::string tempStr = tempLivingNamespaceScopes.ToString() + "." + entryName;
72 if( thisStr == tempStr )
73 {
74 return true;
75 }
76
77 tempLivingNamespaceScopes.pop_back();
78 }
79 return false;
80 }
81 bool IsCoverd( const NamespaceScopes &baseNamespaceScopes, const NamespaceScopes &entryNamespaceScopes ) const
82 {
83 return IsCoverd( baseNamespaceScopes, entryNamespaceScopes.ToString() );
84 }
85
86
87 // 指定された名前空間が同一エリアと見なされるかどうかをチェック
88 bool IsSameAreaNamespace( const NamespaceScopes &baseNamespaceScopes, const NamespaceScopes &entryNamespaceScopes ) const
89 {
90 if( entryNamespaceScopes.size() )
91 {
92 if( IsCoverd( baseNamespaceScopes, entryNamespaceScopes ) )
93 {
94 // 包括しているときは同一と見なす
95 return true;
96 }
97 }
98 else{
99 if( baseNamespaceScopes.size() )
100 {
101 // 名前空間の判断が必要なとき
102 if( this->importedNamespaces.IsImported( baseNamespaceScopes )
103 || IsLiving( baseNamespaceScopes ) )
104 {
105 // Using指定があるとき
106 // または
107 // 指定された名前空間が現在の名前空間スコープと同一のとき
108 return true;
109 }
110 }
111 else{
112 return true;
113 }
114 }
115
116 return false;
117 }
118};
119
120
121}}}
Note: See TracBrowser for help on using the repository browser.