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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: filter.cpp,v $
  4.  * PRODUCTION Revision 1000.0  2004/06/01 21:20:31  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.2
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: filter.cpp,v 1000.0 2004/06/01 21:20:31 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.  * Authors:  Mike DiCuccio
  35.  *
  36.  * File Description:
  37.  *    CFilterSet -- container for a number of column filtering rules
  38.  *    CFilter -- encapsulates a single filter rule
  39.  */
  40. #include <ncbi_pch.hpp>
  41. #include <gui/objutils/filter.hpp>
  42. BEGIN_NCBI_SCOPE
  43. CFilter::CFilter(const string& name, int col, EMode mode,
  44.                  const string& data)
  45.     : m_Name(name),
  46.       m_Col(col),
  47.       m_Mode(mode),
  48.       m_Data(data)
  49. {
  50. }
  51. bool CFilter::Filter(const vector<string>& row, ECompare compare) const
  52. {
  53.     if (m_Col < 0  ||  m_Col >= (int)row.size()) {
  54.         return false;
  55.     }
  56.     switch (m_Mode) {
  57.     case ePass:
  58.         return true;
  59.     case eContains:
  60.         // we force comparison as a string
  61.         return (row[m_Col].find(m_Data) != string::npos);
  62.     case eDoesntContain:
  63.         // we force comparison as a string
  64.         return (row[m_Col].find(m_Data) == string::npos);
  65.     case eEquals:
  66.         if (compare == eString) {
  67.             return (row[m_Col] == m_Data);
  68.         }
  69.         return (NStr::StringToInt(row[m_Col], 10, NStr::eCheck_Skip) ==
  70.                 NStr::StringToInt(m_Data,     10, NStr::eCheck_Skip));
  71.     case eDoesntEqual:
  72.         if (compare == eString) {
  73.             return (row[m_Col] != m_Data);
  74.         }
  75.         return (NStr::StringToInt(row[m_Col], 10, NStr::eCheck_Skip) !=
  76.                 NStr::StringToInt(m_Data,     10, NStr::eCheck_Skip));
  77.     case eLess:
  78.         if (compare == eString) {
  79.             return (row[m_Col] < m_Data);
  80.         }
  81.         return (NStr::StringToInt(row[m_Col], 10, NStr::eCheck_Skip) <
  82.                 NStr::StringToInt(m_Data,     10, NStr::eCheck_Skip));
  83.     case eLessEquals:
  84.         if (compare == eString) {
  85.             return (row[m_Col] <= m_Data);
  86.         }
  87.         return (NStr::StringToInt(row[m_Col], 10, NStr::eCheck_Skip) <=
  88.                 NStr::StringToInt(m_Data,     10, NStr::eCheck_Skip));
  89.     case eGreater:
  90.         if (compare == eString) {
  91.             return (row[m_Col] > m_Data);
  92.         }
  93.         return (NStr::StringToInt(row[m_Col], 10, NStr::eCheck_Skip) >
  94.                 NStr::StringToInt(m_Data,     10, NStr::eCheck_Skip));
  95.     case eGreaterEquals:
  96.         if (compare == eString) {
  97.             return (row[m_Col] >= m_Data);
  98.         }
  99.         return (NStr::StringToInt(row[m_Col], 10, NStr::eCheck_Skip) >=
  100.                 NStr::StringToInt(m_Data,     10, NStr::eCheck_Skip));
  101.     }
  102.     return false;
  103. }
  104. // filter a given row, returning true if a match exists
  105. bool CFilterSet::Filter(const vector<string>& row) const
  106. {
  107.     ITERATE (TFilters, iter, m_Filters) {
  108.         const CFilter& filter = **iter;
  109.         int col = filter.GetColumn();
  110.         if ( !filter.Filter(row, m_ColTypes[col]) ) {
  111.             return false;
  112.         }
  113.     }
  114.     return true;
  115. }
  116. // add a filter to the list
  117. void CFilterSet::Add(CFilter* filter)
  118. {
  119.     m_Filters.push_back(CRef<CFilter>(filter));
  120. }
  121. // remove a named filter
  122. void CFilterSet::Remove(const string& name)
  123. {
  124.     NON_CONST_ITERATE (TFilters, iter, m_Filters) {
  125.         if ((*iter)->GetName() == name) {
  126.             iter = m_Filters.erase(iter);
  127.             --iter;
  128.         }
  129.     }
  130. }
  131. // remove a filter by pointer
  132. void CFilterSet::Remove(CFilter* filter)
  133. {
  134.     NON_CONST_ITERATE (TFilters, iter, m_Filters) {
  135.         if ((*iter).GetPointer() == filter) {
  136.             m_Filters.erase(iter);
  137.             break;
  138.         }
  139.     }
  140. }
  141. void CFilterSet::SetColType(size_t col, CFilter::ECompare comp)
  142. {
  143.     if (m_ColTypes.size() <= col) {
  144.         m_ColTypes.resize(col + 1, CFilter::eString);
  145.     }
  146.     m_ColTypes[col] = comp;
  147. }
  148. END_NCBI_SCOPE
  149. /*
  150.  * ===========================================================================
  151.  * $Log: filter.cpp,v $
  152.  * Revision 1000.0  2004/06/01 21:20:31  gouriano
  153.  * PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.2
  154.  *
  155.  * Revision 1.2  2004/05/21 22:27:43  gorelenk
  156.  * Added PCH ncbi_pch.hpp
  157.  *
  158.  * Revision 1.1  2004/04/30 11:48:15  dicuccio
  159.  * Initial commit - split out from src/gui/utils
  160.  *
  161.  * Revision 1.5  2003/06/23 13:20:50  dicuccio
  162.  * Use size_t instead of int for indexing
  163.  *
  164.  * Revision 1.4  2003/03/11 15:25:12  kuznets
  165.  * iterate -> ITERATE
  166.  *
  167.  * Revision 1.3  2003/01/15 21:15:17  dicuccio
  168.  * Removed useless _TRACE() messages
  169.  *
  170.  * Revision 1.2  2003/01/13 13:10:11  dicuccio
  171.  * Namespace clean-up.  Retired namespace gui -> converted all to namespace
  172.  * ncbi.  Moved all FLUID-generated code into namespace ncbi.
  173.  *
  174.  * Revision 1.1  2003/01/08 15:03:34  dicuccio
  175.  * Added filter classes for filtering rows of string-based data
  176.  *
  177.  * ===========================================================================
  178.  */