source: dev/BasicCompiler_Common/include/Namespace.h@ 105

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

名前空間収集モジュール(NamespaceScopesCollectionクラス)を追加。

File size: 3.3 KB
Line 
1#pragma once
2
3#include <vector>
4#include <string>
5#include <boost/foreach.hpp>
6
7using namespace std;
8
9class NamespaceScopes : public vector<string>
10{
11public:
12 NamespaceScopes(){}
13 NamespaceScopes( const string &namespaceStr );
14 ~NamespaceScopes(){}
15
16 string ToString() const
17 {
18 string namespaceStr;
19 const vector<string> &me = *this;
20
21 bool isFirst = true;
22 BOOST_FOREACH( const string &itemStr, me ){
23 if( isFirst ){
24 isFirst = false;
25 }
26 else{
27 namespaceStr += ".";
28 }
29
30 namespaceStr += itemStr;
31 }
32 return namespaceStr;
33 }
34
35 // 等しいかをチェック
36 bool IsEqual( const string &name ) const
37 {
38 if( ToString() == name ){
39 return true;
40 }
41 return false;
42 }
43
44 // 等しいかをチェック
45 bool IsEqual( const NamespaceScopes &namespaceScopes ) const
46 {
47 if( ToString() == namespaceScopes.ToString() ){
48 return true;
49 }
50 return false;
51 }
52
53 // 所属しているかをチェック
54 // 例:
55 // baseNamespaceScopes = "Discoversoft"
56 // entryNamespaceScopes = "Discoversoft.ActiveBasic"
57 // この場合、entryNamespaceScopes は baseNamespaceScopes に所属している。
58 static bool IsBelong( const NamespaceScopes &baseNamespaceScopes, const NamespaceScopes &entryNamespaceScopes )
59 {
60 if( baseNamespaceScopes.size() > entryNamespaceScopes.size() ){
61 return false;
62 }
63
64 for( int i=0; i<(int)baseNamespaceScopes.size(); i++ ){
65 if( baseNamespaceScopes[i] != entryNamespaceScopes[i] ){
66 return false;
67 }
68 }
69 return true;
70 }
71
72 bool IsUsing() const
73 {
74 // TODO: 実装
75 return false;
76 }
77
78 bool IsLiving() const;
79
80 // 包括しているかをチェック
81 // 例:
82 // this = "Discoversoft.ActiveBasic"
83 // living = "Discoversoft.ActiveBasic"
84 // name = "ActiveBasic"
85 // この場合、living は name を包括している。
86 bool IsCoverd( const string &name ) const;
87 bool IsCoverd( const NamespaceScopes &namespaceScopes ) const;
88
89 // 指定された名前空間が同一エリアと見なされるかどうかをチェック
90 static bool IsSameArea( const NamespaceScopes &baseNamespaceScopes, const NamespaceScopes &entryNamespaceScopes ){
91 if( entryNamespaceScopes.size() ){
92 if( baseNamespaceScopes.IsCoverd( entryNamespaceScopes ) ){
93 // 包括しているときは同一と見なす
94 return true;
95 }
96 }
97 else{
98 if( baseNamespaceScopes.size() ){
99 // 名前空間の判断が必要なとき
100 if( baseNamespaceScopes.IsUsing()
101 || baseNamespaceScopes.IsLiving() ){
102 // Using指定があるとき
103 // または
104 // 指定された名前空間が現在の名前空間スコープと同一のとき
105 return true;
106 }
107 }
108 else{
109 return true;
110 }
111 }
112
113 return false;
114 }
115};
116
117class NamespaceScopesCollection : public vector<NamespaceScopes>
118{
119public:
120 bool IsExist( const NamespaceScopes &namespaceScopes ) const
121 {
122 const NamespaceScopesCollection &namespaceScopesCollection = *this;
123 BOOST_FOREACH( const NamespaceScopes &tempNamespaceScopes, namespaceScopesCollection ){
124 if( tempNamespaceScopes.IsEqual( namespaceScopes ) ){
125 return true;
126 }
127 }
128 return false;
129 }
130 bool IsExist( const string &namespaceStr ) const
131 {
132 return IsExist( NamespaceScopes( namespaceStr ) );
133 }
134 void SplitNamespace( const char *fullName, char *namespaceStr, char *simpleName ) const;
135
136 static bool CollectNamespaces( const char *source, NamespaceScopesCollection &namespaceScopesCollection );
137};
Note: See TracBrowser for help on using the repository browser.