namespace.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:7k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: namespace.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:43:26  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: namespace.cpp,v 1000.1 2004/06/01 19:43:26 gouriano Exp $
  10. * ===========================================================================
  11. *
  12. *                            PUBLIC DOMAIN NOTICE
  13. *               National Center for Biotechnology Information
  14. *
  15. *  This software/database is a "United States Government Work" under the
  16. *  terms of the United States Copyright Act.  It was written as part of
  17. *  the author's official duties as a United States Government employee and
  18. *  thus cannot be copyrighted.  This software/database is freely available
  19. *  to the public for use. The National Library of Medicine and the U.S.
  20. *  Government have not placed any restriction on its use or reproduction.
  21. *
  22. *  Although all reasonable efforts have been taken to ensure the accuracy
  23. *  and reliability of the software and data, the NLM and the U.S.
  24. *  Government do not and cannot warrant the performance or results that
  25. *  may be obtained by using this software or data. The NLM and the U.S.
  26. *  Government disclaim all warranties, express or implied, including
  27. *  warranties of performance, merchantability or fitness for any particular
  28. *  purpose.
  29. *
  30. *  Please cite the author in any work or product based on this material.
  31. *
  32. * ===========================================================================
  33. *
  34. * Author: Eugene Vasilchenko
  35. *
  36. * File Description:
  37. *   !!! PUT YOUR DESCRIPTION HERE !!!
  38. *
  39. * ---------------------------------------------------------------------------
  40. * $Log: namespace.cpp,v $
  41. * Revision 1000.1  2004/06/01 19:43:26  gouriano
  42. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7
  43. *
  44. * Revision 1.7  2004/05/17 21:03:14  gorelenk
  45. * Added include of PCH ncbi_pch.hpp
  46. *
  47. * Revision 1.6  2003/03/11 20:06:47  kuznets
  48. * iterate -> ITERATE
  49. *
  50. * Revision 1.5  2000/08/25 15:59:23  vasilche
  51. * Renamed directory tool -> datatool.
  52. *
  53. * Revision 1.4  2000/04/28 16:58:17  vasilche
  54. * Added classes CByteSource and CByteSourceReader for generic reading.
  55. * Added delayed reading of choice variants.
  56. *
  57. * Revision 1.3  2000/04/18 19:24:37  vasilche
  58. * Added BEGIN_SCOPE and END_SCOPE macros to allow source brawser gather names from namespaces.
  59. *
  60. * Revision 1.2  2000/04/12 15:36:52  vasilche
  61. * Added -on <namespace> argument to datatool.
  62. * Removed unnecessary namespace specifications in generated files.
  63. *
  64. * Revision 1.1  2000/04/07 19:26:30  vasilche
  65. * Added namespace support to datatool.
  66. * By default with argument -oR datatool will generate objects in namespace
  67. * NCBI_NS_NCBI::objects (aka ncbi::objects).
  68. * Datatool's classes also moved to NCBI namespace.
  69. *
  70. * ===========================================================================
  71. */
  72. #include <ncbi_pch.hpp>
  73. #include <corelib/ncbistd.hpp>
  74. #include <corelib/ncbiutil.hpp>
  75. #include <serial/datatool/namespace.hpp>
  76. BEGIN_NCBI_SCOPE
  77. const string CNamespace::KNCBINamespaceName("ncbi");
  78. const string CNamespace::KNCBINamespaceDefine("NCBI_NS_NCBI");
  79. const string CNamespace::KSTDNamespaceName("std");
  80. const string CNamespace::KSTDNamespaceDefine("NCBI_NS_STD");
  81. const CNamespace CNamespace::KEmptyNamespace;
  82. const CNamespace CNamespace::KNCBINamespace(KNCBINamespaceName);
  83. const CNamespace CNamespace::KSTDNamespace(KSTDNamespaceName);
  84. CNamespace::CNamespace(void)
  85. {
  86. }
  87. CNamespace::CNamespace(const string& ns)
  88. {
  89.     SIZE_TYPE pos = 0;
  90.     if ( NStr::StartsWith(ns, "::") )
  91.         pos = 2; // skip leading ::
  92.     SIZE_TYPE end = ns.find("::", pos);
  93.     while ( end != NPOS ) {
  94.         m_Namespaces.push_back(ns.substr(pos, end));
  95.         pos = end + 2;
  96.         end = ns.find("::", pos);
  97.     }
  98.     m_Namespaces.push_back(ns.substr(pos));
  99.     if ( m_Namespaces[0] == KNCBINamespaceDefine )
  100.         m_Namespaces[0] = KNCBINamespaceName;
  101.     else if ( m_Namespaces[0] == KSTDNamespaceDefine )
  102.         m_Namespaces[0] = KSTDNamespaceName;
  103. }
  104. size_t CNamespace::EqualLevels(const CNamespace& ns) const
  105. {
  106.     size_t end = min(GetNamespaceLevel(), ns.GetNamespaceLevel());
  107.     for ( size_t i = 0; i < end; ++i ) {
  108.         if ( GetNamespaces()[i] != ns.GetNamespaces()[i] )
  109.             return i;
  110.     }
  111.     return end;
  112. }
  113. void CNamespace::Set(const CNamespace& ns, CNcbiOstream& out, bool mainHeader)
  114. {
  115.     size_t equal = EqualLevels(ns);
  116.     CloseAllAbove(equal, out);
  117.     for ( size_t i = equal, end = ns.GetNamespaceLevel(); i < end; ++i )
  118.         Open(ns.GetNamespaces()[i], out, mainHeader);
  119. }
  120. string CNamespace::GetNamespaceRef(const CNamespace& ns) const
  121. {
  122.     size_t equal = EqualLevels(ns);
  123.     string s;
  124.     if ( equal == GetNamespaceLevel() ) {
  125.         // internal namespace
  126.     }
  127.     else {
  128.         // reference from root
  129.         equal = 0;
  130.         if ( ns.InNCBI() ) {
  131.             s = KNCBINamespaceDefine;
  132.             equal = 1;
  133.         }
  134.         else if ( ns.InSTD() ) {
  135.             s = KSTDNamespaceDefine;
  136.             equal = 1;
  137.         }
  138.         if ( equal == 1 ) {
  139.             // std or ncbi
  140.             if ( InNCBI() )
  141.                 s.erase();
  142.             else
  143.                 s += "::";
  144.         }
  145.         else {
  146.             // from root
  147.             s = "::";
  148.         }
  149.     }
  150.     for ( size_t i = equal, end = ns.GetNamespaceLevel(); i < end; ++i ) {
  151.         s += ns.GetNamespaces()[i];
  152.         s += "::";
  153.     }
  154.     return s;
  155. }
  156. void CNamespace::Open(const string& s, CNcbiOstream& out, bool mainHeader)
  157. {
  158.     m_Namespaces.push_back(s);
  159.     if ( IsNCBI() ) {
  160.         out <<
  161.             "BEGIN_NCBI_SCOPEn"
  162.             "n";
  163.     }
  164.     else {
  165.         if ( mainHeader ) {
  166.             out <<
  167.                 "#ifndef BEGIN_"<<s<<"_SCOPEn"
  168.                 "#  define BEGIN_"<<s<<"_SCOPE BEGIN_SCOPE("<<s<<")n"
  169.                 "#  define END_"<<s<<"_SCOPE END_SCOPE("<<s<<")n"
  170.                 "#endifn";
  171.         }
  172.         out <<
  173.             "BEGIN_"<<s<<"_SCOPE // namespace "<<*this<<"n"
  174.             "n";
  175.     }
  176. }
  177. void CNamespace::Close(CNcbiOstream& out)
  178. {
  179.     _ASSERT(!m_Namespaces.empty());
  180.     if ( IsNCBI() ) {
  181.         out <<
  182.             "END_NCBI_SCOPEn"
  183.             "n";
  184.     }
  185.     else {
  186.         out <<
  187.             "END_"<<m_Namespaces.back()<<"_SCOPE // namespace "<<*this<<"n"
  188.             "n";
  189.     }
  190.     m_Namespaces.pop_back();
  191. }
  192. void CNamespace::CloseAllAbove(size_t level, CNcbiOstream& out)
  193. {
  194.     for ( size_t size = GetNamespaceLevel(); size > level; --size )
  195.         Close(out);
  196. }
  197. CNcbiOstream& CNamespace::PrintFullName(CNcbiOstream& out) const
  198. {
  199.     ITERATE ( TNamespaces, i, GetNamespaces() )
  200.         out << *i << "::";
  201.     return out;
  202. }
  203. void CNamespace::ToStringTo(string& s) const
  204. {
  205.     ITERATE ( TNamespaces, i, GetNamespaces() ) {
  206.         s += *i;
  207.         s += "::";
  208.     }
  209. }
  210. END_NCBI_SCOPE