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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: test_staticmap.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:42:58  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: test_staticmap.cpp,v 1000.1 2004/06/01 19:42:58 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.  *   Test program for CStaticArraySet<> and CStaticArrayMap<>
  38.  *
  39.  */
  40. #include <ncbi_pch.hpp>
  41. #include <corelib/ncbistd.hpp>
  42. #include <corelib/ncbiapp.hpp>
  43. #include <corelib/ncbiargs.hpp>
  44. #include <corelib/ncbiutil.hpp>
  45. #include <util/static_map.hpp>
  46. #include <util/static_set.hpp>
  47. #include <stdlib.h>
  48. #include <set>
  49. #include <map>
  50. #include <test/test_assert.h>  /* This header must go last */
  51. BEGIN_NCBI_SCOPE
  52. class CTestStaticMap : public CNcbiApplication
  53. {
  54. public:
  55.     void Init(void);
  56.     int Run(void);
  57.     void TestStaticMap(void) const;
  58.     void TestStaticSet(void) const;
  59.     bool m_Silent;
  60.     int m_NumberOfElements;
  61.     int m_LookupCount;
  62.     enum ETestBadData {
  63.         eBad_none,
  64.         eBad_swap_at_begin,
  65.         eBad_equal_at_begin,
  66.         eBad_equal_at_end,
  67.         eBad_swap_at_end
  68.     };
  69.     ETestBadData m_TestBadData;
  70. };
  71. void CheckValue(int value1, int value2)
  72. {
  73.     _ASSERT(value1 == value2);
  74. }
  75. void CheckValue(const pair<int, int>& value1, const pair<int, int>& value2)
  76. {
  77.     CheckValue(value1.first, value2.first);
  78.     CheckValue(value1.second, value2.second);
  79. }
  80. void CheckValue(const pair<const int, int>& value1, 
  81.                 const pair<int, int>& value2)
  82. {
  83.     CheckValue(value1.first, value2.first);
  84.     CheckValue(value1.second, value2.second);
  85. }
  86. inline
  87. int distance(const int* p1, const int* p2)
  88. {
  89.     return p2 - p1;
  90. }
  91. inline
  92. int distance(const pair<int, int>* p1, const pair<int, int>* p2)
  93. {
  94.     return p2 - p1;
  95. }
  96. template<class TRef, class TTst>
  97. void CheckIter(const TRef& ref, const TTst& tst,
  98.                const typename TRef::const_iterator& ref_iter,
  99.                const typename TTst::const_iterator& tst_iter)
  100. {
  101.     _ASSERT((ref_iter == ref.end()) == (tst_iter == tst.end()));
  102.     if ( ref_iter != ref.end() ) {
  103.         CheckValue(*ref_iter, *tst_iter);
  104.     }
  105. }
  106. template<class TRef, class TTst>
  107. void TestAll(const typename TRef::key_type& key, const TRef& ref,
  108.              const TTst& tst, const typename TTst::value_type arr[])
  109. {
  110.     CheckIter(ref, tst, ref.find(key), tst.find(key));
  111.     _ASSERT(ref.count(key) == tst.count(key));
  112.     {{ // test index_of()
  113.         typename TRef::const_iterator ref_iter = ref.find(key);
  114.         typename TTst::const_iterator tst_iter = tst.find(key);
  115.         int tst_index = tst.index_of(key);
  116.         _ASSERT((ref_iter == ref.end()) == (tst_index == tst.eNpos));
  117.         if ( ref_iter != ref.end() ) {
  118.             _ASSERT(tst_index >= 0 && tst_index < int(ref.size()));
  119.             CheckValue(*ref_iter, arr[tst_index]);
  120.             _ASSERT(tst_index == distance(tst.begin(), tst_iter));
  121.             _ASSERT(tst_iter == tst.lower_bound(key));
  122.         }
  123.     }}
  124.     
  125.     CheckIter(ref, tst, ref.lower_bound(key), tst.lower_bound(key));
  126.     CheckIter(ref, tst, ref.upper_bound(key), tst.upper_bound(key));
  127.     
  128.     CheckIter(ref, tst,
  129.               ref.equal_range(key).first, tst.equal_range(key).first);
  130.     CheckIter(ref, tst,
  131.               ref.equal_range(key).second, tst.equal_range(key).second);
  132.     
  133.     CheckIter(tst, tst, tst.lower_bound(key), tst.equal_range(key).first);
  134.     CheckIter(tst, tst, tst.upper_bound(key), tst.equal_range(key).second);
  135.     
  136.     _ASSERT(int(tst.count(key)) == distance(tst.lower_bound(key),
  137.                                             tst.upper_bound(key)));
  138. }
  139. void CTestStaticMap::TestStaticSet(void) const
  140. {
  141.     LOG_POST(Info << "Testing CStaticArraySet<int>");
  142.     typedef set<int> TRef;
  143.     typedef CStaticArraySet<int, less<int> > TTst;
  144.     TRef ref;
  145.     while ( int(ref.size()) < m_NumberOfElements ) {
  146.         ref.insert(rand());
  147.     }
  148.     int* arr = new int[m_NumberOfElements];
  149.     {{
  150.         int index = 0;
  151.         ITERATE ( TRef, it, ref ) {
  152.             arr[index++] = *it;
  153.         }
  154.         if ( m_NumberOfElements >= 2 ) {
  155.             switch ( m_TestBadData ) {
  156.             case eBad_swap_at_begin:
  157.                 swap(arr[0], arr[1]);
  158.                 break;
  159.             case eBad_swap_at_end:
  160.                 swap(arr[m_NumberOfElements-1], arr[m_NumberOfElements-2]);
  161.                 break;
  162.             case eBad_equal_at_begin:
  163.                 arr[0] = arr[1];
  164.                 break;
  165.             case eBad_equal_at_end:
  166.                 arr[m_NumberOfElements-1] = arr[m_NumberOfElements-2];
  167.                 break;
  168.             default:
  169.                 break;
  170.             }
  171.         }
  172.     }}
  173.     TTst tst(arr, sizeof(*arr)*m_NumberOfElements);
  174.     _ASSERT(ref.empty() == tst.empty());
  175.     _ASSERT(ref.size() == tst.size());
  176.     for ( int i = 0; i < m_LookupCount; ++i ) {
  177.         int key = rand();
  178.         TestAll(key, ref, tst, arr);
  179.     }
  180.     delete[] arr;
  181.     LOG_POST(Info << "Test CStaticArraySet passed");
  182. }
  183. void CTestStaticMap::TestStaticMap(void) const
  184. {
  185.     LOG_POST(Info << "Testing CStaticArrayMap<int, int>");
  186.     typedef map<int, int, greater<int> > TRef;
  187.     typedef CStaticArrayMap<int, int, greater<int> > TTst;
  188.     TRef ref;
  189.     while ( int(ref.size()) < m_NumberOfElements ) {
  190.         ref.insert(TRef::value_type(rand(), rand()));
  191.     }
  192.     pair<int, int>* arr = new pair<int, int>[m_NumberOfElements];
  193.     {{
  194.         int index = 0;
  195.         ITERATE ( TRef, it, ref ) {
  196.             arr[index++] = TTst::value_type(it->first, it->second);
  197.         }
  198.         if ( m_NumberOfElements >= 2 ) {
  199.             switch ( m_TestBadData ) {
  200.             case eBad_swap_at_begin:
  201.                 swap(arr[0], arr[1]);
  202.                 break;
  203.             case eBad_swap_at_end:
  204.                 swap(arr[m_NumberOfElements-1], arr[m_NumberOfElements-2]);
  205.                 break;
  206.             case eBad_equal_at_begin:
  207.                 arr[0] = arr[1];
  208.                 break;
  209.             case eBad_equal_at_end:
  210.                 arr[m_NumberOfElements-1] = arr[m_NumberOfElements-2];
  211.                 break;
  212.             default:
  213.                 break;
  214.             }
  215.         }
  216.     }}
  217.     TTst tst(arr, sizeof(*arr)*m_NumberOfElements);
  218.     _ASSERT(ref.empty() == tst.empty());
  219.     _ASSERT(ref.size() == tst.size());
  220.     for ( int i = 0; i < m_LookupCount; ++i ) {
  221.         int key = rand();
  222.         TestAll(key, ref, tst, arr);
  223.     }
  224.     delete[] arr;
  225.     LOG_POST(Info << "Test CStaticArrayMap passed");
  226. }
  227. void CTestStaticMap::Init(void)
  228. {
  229.     SetDiagPostLevel(eDiag_Info);
  230.     auto_ptr<CArgDescriptions> d(new CArgDescriptions);
  231.     d->SetUsageContext("test_staticmap",
  232.                        "test CStaticArraySet and CStaticArrayMap classes");
  233.     d->AddDefaultKey("t", "type",
  234.                      "type of container to use",
  235.                      CArgDescriptions::eString, "both");
  236.     d->SetConstraint("t", (new CArgAllow_Strings)->
  237.                      Allow("set")->
  238.                      Allow("map")->
  239.                      Allow("both"));
  240.     d->AddFlag("s",
  241.                "silent operation - do not print log");
  242.     d->AddDefaultKey("n", "numberOfElements",
  243.                      "number of elements to put into container",
  244.                      CArgDescriptions::eInteger, "100");
  245.     d->AddDefaultKey("c", "count",
  246.                      "how may times to run lookup test",
  247.                      CArgDescriptions::eInteger, "100000");
  248.     d->AddDefaultKey("b", "badDataType",
  249.                      "type of bad data to test",
  250.                      CArgDescriptions::eString, "none");
  251.     d->SetConstraint("b", (new CArgAllow_Strings)->
  252.                      Allow("none")->
  253.                      Allow("swap_at_begin")->
  254.                      Allow("swap_at_end")->
  255.                      Allow("equal_at_begin")->
  256.                      Allow("equal_at_end"));
  257.     SetupArgDescriptions(d.release());
  258. }
  259. int CTestStaticMap::Run(void)
  260. {
  261.     const CArgs& args = GetArgs();
  262.     m_Silent = args["s"];
  263.     m_NumberOfElements = args["n"].AsInteger();
  264.     m_LookupCount = args["c"].AsInteger();
  265.     {{
  266.         string bad_type = args["b"].AsString();
  267.         if ( bad_type == "swap_at_begin" )
  268.             m_TestBadData = eBad_swap_at_begin;
  269.         else if ( bad_type == "swap_at_end" )
  270.             m_TestBadData = eBad_swap_at_end;
  271.         else if ( bad_type == "equal_at_begin" )
  272.             m_TestBadData = eBad_equal_at_begin;
  273.         else if ( bad_type == "equal_at_end" )
  274.             m_TestBadData = eBad_equal_at_end;
  275.         else
  276.             m_TestBadData = eBad_none;
  277.     }}
  278.         
  279.     string type = args["t"].AsString();
  280.     if ( type == "set" || type == "both" ) {
  281.         TestStaticSet();
  282.     }
  283.     if ( type == "map" || type == "both" ) {
  284.         TestStaticMap();
  285.     }
  286.     return 0;
  287. }
  288. END_NCBI_SCOPE
  289. int main(int argc, const char* argv[])
  290. {
  291.     return NCBI_NS_NCBI::CTestStaticMap().AppMain(argc, argv);
  292. }
  293. /*
  294.  * ===========================================================================
  295.  * $Log: test_staticmap.cpp,v $
  296.  * Revision 1000.1  2004/06/01 19:42:58  gouriano
  297.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  298.  *
  299.  * Revision 1.6  2004/05/17 21:09:26  gorelenk
  300.  * Added include of PCH ncbi_pch.hpp
  301.  *
  302.  * Revision 1.5  2004/01/23 18:59:18  vasilche
  303.  * Added test of order validation.
  304.  *
  305.  * Revision 1.4  2004/01/23 18:50:48  vasilche
  306.  * Fixed for MSVC compiler.
  307.  *
  308.  * Revision 1.3  2004/01/23 18:15:48  vasilche
  309.  * Fixed initialization of test map.
  310.  *
  311.  * Revision 1.2  2004/01/23 18:09:42  vasilche
  312.  * Fixed for WorkShop compiler.
  313.  *
  314.  * Revision 1.1  2004/01/23 18:02:25  vasilche
  315.  * Cleaned implementation of CStaticArraySet & CStaticArrayMap.
  316.  * Added test utility test_staticmap.
  317.  *
  318.  * ===========================================================================
  319.  */