source: dev/trunk/ab5.0/abdev/ab_common/include/Lexical/Namespace.h@ 669

Last change on this file since 669 was 669, checked in by dai_9181, 16 years ago

NamespaceScopes::IsEqualを高速化した(他、リファクタリング)。

File size: 3.0 KB
RevLine 
[215]1#pragma once
2
3
[505]4namespace ActiveBasic{ namespace Common{ namespace Lexical{
[215]5
[505]6
7class NamespaceScopes : public std::vector<std::string>
[215]8{
9 // XMLシリアライズ用
10private:
11 friend class boost::serialization::access;
12 template<class Archive> void serialize(Archive& ar, const unsigned int version)
13 {
[523]14 ar & boost::serialization::make_nvp("vector_string", boost::serialization::base_object<std::vector<std::string>>(*this));
[215]15 }
16
17
18public:
19 NamespaceScopes(){}
[505]20 NamespaceScopes( const std::string &namespaceStr );
[215]21 ~NamespaceScopes(){}
22
[669]23 NamespaceScopes operator+ ( const NamespaceScopes &namespaceScopes ) const;
24
[505]25 std::string ToString() const
[215]26 {
[505]27 std::string namespaceStr;
28 const std::vector<std::string> &me = *this;
[215]29
30 bool isFirst = true;
[505]31 BOOST_FOREACH( const std::string &itemStr, me ){
[215]32 if( isFirst ){
33 isFirst = false;
34 }
35 else{
36 namespaceStr += ".";
37 }
38
39 namespaceStr += itemStr;
40 }
41 return namespaceStr;
42 }
43
44 // 等しいかをチェック
[505]45 bool IsEqual( const std::string &name ) const
[215]46 {
47 if( ToString() == name ){
48 return true;
49 }
50 return false;
51 }
52
53 // 等しいかをチェック
[669]54 bool IsEqual( const NamespaceScopes &namespaceScopes ) const;
[215]55
56 // 所属しているかをチェック
57 // 例:
58 // baseNamespaceScopes = "Discoversoft"
59 // entryNamespaceScopes = "Discoversoft.ActiveBasic"
60 // この場合、entryNamespaceScopes は baseNamespaceScopes に所属している。
61 static bool IsBelong( const NamespaceScopes &baseNamespaceScopes, const NamespaceScopes &entryNamespaceScopes )
62 {
63 if( baseNamespaceScopes.size() > entryNamespaceScopes.size() ){
64 return false;
65 }
66
67 for( int i=0; i<(int)baseNamespaceScopes.size(); i++ ){
68 if( baseNamespaceScopes[i] != entryNamespaceScopes[i] ){
69 return false;
70 }
71 }
72 return true;
73 }
74};
75
[505]76class NamespaceScopesCollection : public std::vector<NamespaceScopes>
[215]77{
78 // XMLシリアライズ用
79private:
80 friend class boost::serialization::access;
81 template<class Archive> void serialize(Archive& ar, const unsigned int version)
82 {
83 ar & boost::serialization::make_nvp("vector_NamespaceScopes", boost::serialization::base_object<vector<NamespaceScopes>>(*this));
84 }
85
86public:
87 bool IsExist( const NamespaceScopes &namespaceScopes ) const
88 {
89 const NamespaceScopesCollection &namespaceScopesCollection = *this;
90 BOOST_FOREACH( const NamespaceScopes &tempNamespaceScopes, namespaceScopesCollection ){
91 if( tempNamespaceScopes.IsEqual( namespaceScopes ) ){
92 return true;
93 }
94 }
95 return false;
96 }
[505]97 bool IsExist( const std::string &namespaceStr ) const
[215]98 {
99 return IsExist( NamespaceScopes( namespaceStr ) );
100 }
101
102 bool IsImported( const NamespaceScopes &namespaceScopes ) const
103 {
104 const NamespaceScopesCollection &namespaceScopesCollection = *this;
105 BOOST_FOREACH( const NamespaceScopes &tempNamespaceScopes, namespaceScopesCollection )
106 {
107 if( namespaceScopes.IsEqual( tempNamespaceScopes ) )
108 {
109 return true;
110 }
111 }
112 return false;
113 }
114
115 void SplitNamespace( const char *fullName, char *namespaceStr, char *simpleName ) const;
116};
[505]117
118
119}}}
Note: See TracBrowser for help on using the repository browser.