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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: static_map.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:38:53  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef UTIL___STATIC_MAP__HPP
  10. #define UTIL___STATIC_MAP__HPP
  11. /*  $Id: static_map.hpp,v 1000.1 2004/06/01 19:38:53 gouriano Exp $
  12.  * ===========================================================================
  13.  *
  14.  *                            PUBLIC DOMAIN NOTICE
  15.  *               National Center for Biotechnology Information
  16.  *
  17.  *  This software/database is a "United States Government Work" under the
  18.  *  terms of the United States Copyright Act.  It was written as part of
  19.  *  the author's official duties as a United States Government employee and
  20.  *  thus cannot be copyrighted.  This software/database is freely available
  21.  *  to the public for use. The National Library of Medicine and the U.S.
  22.  *  Government have not placed any restriction on its use or reproduction.
  23.  *
  24.  *  Although all reasonable efforts have been taken to ensure the accuracy
  25.  *  and reliability of the software and data, the NLM and the U.S.
  26.  *  Government do not and cannot warrant the performance or results that
  27.  *  may be obtained by using this software or data. The NLM and the U.S.
  28.  *  Government disclaim all warranties, express or implied, including
  29.  *  warranties of performance, merchantability or fitness for any particular
  30.  *  purpose.
  31.  *
  32.  *  Please cite the author in any work or product based on this material.
  33.  *
  34.  * ===========================================================================
  35.  *
  36.  * Authors:  Mike DiCuccio
  37.  *
  38.  * File Description:
  39.  *     CStaticArrayMap<> -- template class to provide convenient access to
  40.  *                          a statically-defined array, while making sure that
  41.  *                          the order of the array meets sort criteria in
  42.  *                          debug builds.
  43.  *
  44.  */
  45. #include <util/static_set.hpp>
  46. #include <utility>
  47. BEGIN_NCBI_SCOPE
  48. ///
  49. /// class CStaticArrayMap<> is an array adaptor that provides an STLish
  50. /// interface to statically-defined arrays, while making efficient use
  51. /// of the inherent sort order of such arrays.
  52. ///
  53. /// This class can be used both to verify sorted order of a static array
  54. /// and to access a static array cleanly.  The template parameters are
  55. /// as follows:
  56. ///
  57. ///   KeyType    -- type of key object used for access
  58. ///   ValueType  -- type of object used for access
  59. ///   KeyCompare -- comparison functor.  This must provide an operator(). 
  60. ///         This is patterned to accept PCase and PNocase and similar objects.
  61. ///
  62. /// To use this class, define your static array as follows:
  63. ///
  64. ///  static const char* sc_MyArray[] = {
  65. ///      "val1",
  66. ///      "val2",
  67. ///      "val3"
  68. ///  };
  69. ///
  70. /// Then, declare a static variable such as:
  71. ///
  72. ///     typedef StaticArraySet<const char*, PNocase> TStaticArray;
  73. ///     static TStaticArray sc_Array(sc_MyArray, sizeof(sc_MyArray));
  74. ///
  75. /// In debug mode, the constructor will scan the list of items and insure
  76. /// that they are in the sort order defined by the comparator used.  If the
  77. /// sort order is not correct, then the constructor will ASSERT().
  78. ///
  79. /// This can then be accessed as
  80. ///
  81. ///     if (sc_Array.find(some_value) != sc_Array.end()) {
  82. ///         ...
  83. ///     }
  84. ///
  85. /// or
  86. ///
  87. ///     size_t idx = sc_Array.index_of(some_value);
  88. ///     if (idx != TStaticArray::eNpos) {
  89. ///         ...
  90. ///     }
  91. ///
  92. ///
  93. template<class ValueType,
  94.          class FirstCompare = less<typename ValueType::first_type> >
  95. class PLessByFirst
  96. {
  97. public:
  98.     typedef ValueType                       value_type;
  99.     typedef typename value_type::first_type first_type;
  100.     typedef FirstCompare                    first_compare;
  101.     PLessByFirst()
  102.     {
  103.     }
  104.     PLessByFirst(const first_compare& comp)
  105.         : m_FirstComp(comp)
  106.     {
  107.     }
  108.     bool operator()(const value_type& v0, const value_type& v1) const
  109.     {
  110.         return m_FirstComp(v0.first, v1.first);
  111.     }
  112.     bool operator()(const first_type& v0, const value_type& v1) const
  113.     {
  114.         return m_FirstComp(v0, v1.first);
  115.     }
  116.     bool operator()(const value_type& v0, const first_type& v1) const
  117.     {
  118.         return m_FirstComp(v0.first, v1);
  119.     }
  120.     const first_compare& first_comp() const
  121.     {
  122.         return m_FirstComp;
  123.     }
  124. private:
  125.     first_compare m_FirstComp;
  126. };
  127. ///
  128. /// class CStaticArrayMap<> provides access to a static array in much the
  129. /// same way as CStaticArraySet<>, except that it provides arbitrary
  130. /// binding of a value type to each sorted key, much like an STL map<> would.
  131. ///
  132. template <class KeyType, class ValueType, class KeyCompare = less<KeyType> >
  133. class CStaticArrayMap
  134.     : public CStaticArraySearchBase< KeyType, pair<KeyType, ValueType>,
  135.                                      PLessByFirst< pair<KeyType, ValueType>,
  136.                                                     KeyCompare > >
  137. {
  138.     typedef CStaticArraySearchBase< KeyType, pair<KeyType, ValueType>,
  139.                                     PLessByFirst< pair<KeyType, ValueType>,
  140.                                                   KeyCompare > > TBase;
  141. public:
  142.     typedef typename TBase::key_type        key_type;
  143.     typedef KeyCompare                      key_compare;
  144.     typedef ValueType                       mapped_type;
  145.     typedef typename TBase::value_type      value_type;
  146.     typedef typename TBase::value_compare   value_compare;
  147.     typedef typename TBase::const_reference const_reference;
  148.     typedef typename TBase::const_iterator  const_iterator;
  149.     typedef typename TBase::size_type       size_type;
  150.     typedef typename TBase::difference_type difference_type;
  151.     /// default constructor.  This will build a map around a given array; the
  152.     /// storage of the end pointer is based on the supplied array size.  In
  153.     /// debug mode, this will verify that the array is sorted.
  154.     CStaticArrayMap(const_iterator obj, size_type array_size)
  155.         : TBase(obj, array_size)
  156.     {
  157.     }
  158.     /// Constructor to initialize comparator object.
  159.     CStaticArrayMap(const_iterator obj, size_type array_size,
  160.                     const key_compare& comp)
  161.         : TBase(obj, array_size, comp)
  162.     {
  163.     }
  164.     /// Return the key comparison object
  165.     const key_compare& key_comp() const
  166.     {
  167.         return this->value_comp().first_comp();
  168.     }
  169. };
  170. END_NCBI_SCOPE
  171. /*
  172.  * ===========================================================================
  173.  * $Log: static_map.hpp,v $
  174.  * Revision 1000.1  2004/06/01 19:38:53  gouriano
  175.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  176.  *
  177.  * Revision 1.4  2004/04/26 14:52:14  ucko
  178.  * Add "this->" as needed to accommodate GCC 3.4's stricter treatment of
  179.  * templates.
  180.  *
  181.  * Revision 1.3  2004/01/23 18:02:23  vasilche
  182.  * Cleaned implementation of CStaticArraySet & CStaticArrayMap.
  183.  * Added test utility test_staticmap.
  184.  *
  185.  * Revision 1.2  2004/01/22 14:51:03  dicuccio
  186.  * Fixed erroneous variable names
  187.  *
  188.  * Revision 1.1  2004/01/22 13:22:12  dicuccio
  189.  * Initial revision
  190.  *
  191.  * ===========================================================================
  192.  */
  193. #endif  // UTIL___STATIC_MAP__HPP