name.h
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:5k
源码类别:

OpenGL

开发平台:

Visual C++

  1. //
  2. // C++ Interface: name
  3. //
  4. // Description:
  5. //
  6. //
  7. // Author: Toti <root@totibox>, (C) 2005
  8. //
  9. // Copyright: See COPYING file that comes with this distribution
  10. //
  11. //
  12. #ifndef _NAME_H_
  13. #define _NAME_H_
  14. #include <string>
  15. #include <iostream>
  16. #include <map>
  17. #include <vector>
  18. #include <celutil/basictypes.h>
  19. #include <celutil/debug.h>
  20. #include <celutil/util.h>
  21. #include <celutil/utf8.h>
  22. // TODO: this can be "detemplatized" by creating e.g. a global-scope enum InvalidCatalogNumber since there
  23. // lies the one and only need for type genericity.
  24. template <class OBJ> class NameDatabase
  25. {
  26.  public:
  27.     typedef std::map<std::string, uint32, CompareIgnoringCasePredicate> NameIndex;
  28.     typedef std::multimap<uint32, std::string> NumberIndex;
  29.  public:
  30.     NameDatabase() {};
  31.     uint32 getNameCount() const;
  32.     void add(const uint32, const std::string&);
  33.     // delete all names associated with the specified catalog number
  34.     void erase(const uint32);
  35.     uint32      getCatalogNumberByName(const std::string&) const;
  36.     std::string getNameByCatalogNumber(const uint32)       const;
  37.     NumberIndex::const_iterator getFirstNameIter(const uint32 catalogNumber) const;
  38.     NumberIndex::const_iterator getFinalNameIter() const;
  39.     std::vector<std::string> getCompletion(const std::string& name) const;
  40.  protected:
  41.     NameIndex   nameIndex;
  42.     NumberIndex numberIndex;
  43. };
  44. template <class OBJ>
  45. uint32 NameDatabase<OBJ>::getNameCount() const
  46. {
  47.     return nameIndex.size();
  48. }
  49. template <class OBJ>
  50. void NameDatabase<OBJ>::add(const uint32 catalogNumber, const std::string& name)
  51. {
  52.     if (name.length() != 0)
  53.     {
  54. #ifdef DEBUG
  55.         uint32 tmp;
  56.         if ((tmp = getCatalogNumberByName(name)) != OBJ::InvalidCatalogNumber)
  57.             DPRINTF(2,"Duplicated name '%s' on object with catalog numbers: %d and %dn", name.c_str(), tmp, catalogNumber);
  58. #endif
  59.         // Add the new name
  60.         //nameIndex.insert(NameIndex::value_type(name, catalogNumber));
  61.         nameIndex[name]   = catalogNumber;
  62.         numberIndex.insert(NumberIndex::value_type(catalogNumber, name));
  63.     }
  64. }
  65. template <class OBJ>
  66. void NameDatabase<OBJ>::erase(const uint32 catalogNumber)
  67. {
  68.     numberIndex.erase(catalogNumber);
  69. }
  70. template <class OBJ>
  71. uint32 NameDatabase<OBJ>::getCatalogNumberByName(const std::string& name) const
  72. {
  73.     NameIndex::const_iterator iter = nameIndex.find(name);
  74.     if (iter == nameIndex.end())
  75.         return OBJ::InvalidCatalogNumber;
  76.     else
  77.         return iter->second;
  78. }
  79. // Return the first name matching the catalog number or end()
  80. // if there are no matching names.  The first name *should* be the
  81. // proper name of the OBJ, if one exists. This requires the
  82. // OBJ name database file to have the proper names listed before
  83. // other designations.  Also, the STL implementation must
  84. // preserve this order when inserting the names into the multimap
  85. // (not certain whether or not this behavior is in the STL spec.
  86. // but it works on the implementations I've tried so far.)
  87. template <class OBJ>
  88. std::string NameDatabase<OBJ>::getNameByCatalogNumber(const uint32 catalogNumber) const
  89. {
  90.    if (catalogNumber == OBJ::InvalidCatalogNumber)
  91.         return "";
  92.    NumberIndex::const_iterator iter   = numberIndex.lower_bound(catalogNumber);
  93.    if (iter != numberIndex.end() && iter->first == catalogNumber)
  94.        return iter->second;
  95. }
  96. // Return the first name matching the catalog number or end()
  97. // if there are no matching names.  The first name *should* be the
  98. // proper name of the OBJ, if one exists. This requires the
  99. // OBJ name database file to have the proper names listed before
  100. // other designations.  Also, the STL implementation must
  101. // preserve this order when inserting the names into the multimap
  102. // (not certain whether or not this behavior is in the STL spec.
  103. // but it works on the implementations I've tried so far.)
  104. template <class OBJ>
  105. NameDatabase<OBJ>::NumberIndex::const_iterator NameDatabase<OBJ>::getFirstNameIter(const uint32 catalogNumber) const
  106. {
  107.     NumberIndex::const_iterator iter   = numberIndex.lower_bound(catalogNumber);
  108.     if (iter == numberIndex.end() || iter->first != catalogNumber)
  109.         return getFinalNameIter();
  110.     else
  111.         return iter;
  112. }
  113. template <class OBJ>
  114. NameDatabase<OBJ>::NumberIndex::const_iterator NameDatabase<OBJ>::getFinalNameIter() const
  115. {
  116.     return numberIndex.end();
  117. }
  118. template <class OBJ>
  119. std::vector<std::string> NameDatabase<OBJ>::getCompletion(const std::string& name) const
  120. {
  121.     std::vector<std::string> completion;
  122.     int name_length = UTF8Length(name);
  123.     for (NameIndex::const_iterator iter = nameIndex.begin(); iter != nameIndex.end(); ++iter)
  124.     {
  125.         if (!UTF8StringCompare(iter->first, name, name_length))
  126.         {
  127.             completion.push_back(iter->first);
  128.         }
  129.     }
  130.     return completion;
  131. }
  132. #endif  // _NAME_H_