#pragma once #include namespace ActiveBasic{ namespace Common{ namespace Lexical{ class NamespaceScopes : public std::vector { // XMLシリアライズ用 private: friend class boost::serialization::access; template void serialize(Archive& ar, const unsigned int version) { ar & boost::serialization::make_nvp("vector_string", boost::serialization::base_object>(*this)); } public: NamespaceScopes(){} NamespaceScopes( const std::string &namespaceStr ); NamespaceScopes( NamespaceScopes::const_iterator first, NamespaceScopes::const_iterator last ) : std::vector( first, last ) { } ~NamespaceScopes(){} NamespaceScopes operator+ ( const NamespaceScopes &namespaceScopes ) const; void append( const NamespaceScopes &namespaceScopes ) { insert( end(), namespaceScopes.begin(), namespaceScopes.end() ); } std::string ToString() const { std::string namespaceStr; const std::vector &me = *this; bool isFirst = true; BOOST_FOREACH( const std::string &itemStr, me ){ if( isFirst ){ isFirst = false; } else{ namespaceStr += '.'; } namespaceStr += itemStr; } return namespaceStr; } // 等しいかをチェック bool IsEqual( const std::string &name ) const { if( ToString() == name ){ return true; } return false; } // 等しいかをチェック bool IsEqual( const NamespaceScopes &namespaceScopes ) const; // 所属しているかをチェック // 例: // baseNamespaceScopes = "Discoversoft" // entryNamespaceScopes = "Discoversoft.ActiveBasic" // この場合、entryNamespaceScopes は baseNamespaceScopes に所属している。 static bool IsBelong( const NamespaceScopes &baseNamespaceScopes, const NamespaceScopes &entryNamespaceScopes ) { if( baseNamespaceScopes.size() > entryNamespaceScopes.size() ){ return false; } return std::equal( baseNamespaceScopes.begin(), baseNamespaceScopes.end(), entryNamespaceScopes.begin() ); } }; inline bool operator ==( const NamespaceScopes &lhs, const NamespaceScopes &rhs ) { return lhs.IsEqual( rhs ); } class NamespaceScopesCollection : public std::vector { // XMLシリアライズ用 private: friend class boost::serialization::access; template void serialize(Archive& ar, const unsigned int version) { ar & boost::serialization::make_nvp("vector_NamespaceScopes", boost::serialization::base_object>(*this)); } public: bool IsExist( const NamespaceScopes &namespaceScopes ) const { return std::find( this->begin(), this->end(), namespaceScopes ) != this->end(); } bool IsExist( const std::string &namespaceStr ) const { return IsExist( NamespaceScopes( namespaceStr ) ); } bool IsImported( const NamespaceScopes &namespaceScopes ) const { return IsExist( namespaceScopes ); } void SplitNamespace( const char *fullName, char *namespaceStr, char *simpleName ) const; }; }}}