www.pudn.com > CIVStringSet.zip > StringSet.H


// StringSet.H: interface for the CIVStringSet class. 
// 
// Written 12 June 2002 by Scot T Brennecke 
// Thanks to Moishe Halibard and Moshe Rubin for their article, 
//    "A Multiple Substring Search Algorithm" in the June 2002 
//    edition of C/C++ Users Journal.  This class is based on 
//    the algorthim therein described, but extended to return 
//    all strings and use MFC classes. 
 
#pragma once 
 
#pragma warning(disable: 4100 4786) 
#include  
 
class CIVStringSet : public CStringArray 
{ 
    public: 
        CIVStringSet( WORD wInitialWidth = 64 ) ;  // Initial width of FSM 
        virtual ~CIVStringSet() ; 
 
        bool     Add( LPCTSTR pszWord ) ;                     // a single word 
        bool     Add( const CString & rstrWord ) ;            // a single word 
        int      Add( LPCTSTR pszWords, LPCTSTR pszDelims ) ; // multiple words, delimited with chars from pszDelims 
        int      Add( LPCTSTR pszzWords, int nWords ) ;       // nWords words, each 0 term'd, with extra 0 at end 
        int      Add( CStringArray astrWords ) ;              // all the elements of a CStringArray 
        int      Add( CStringList  lstrWords ) ;              // all the elements of a CStringList 
 
        UINT     FindFirstIn( CString strText, int & rnFirst ) ;    // Begin iteration 
        UINT     FindNext( int & rnNext ) ;                         // Continue interation 
 
        typedef std::pair              CWordPosPair ;     // first is index of word in array, second is position in text 
        typedef std::list< std::pair > CWordPosPairList ; // list of pairs to be returned by FindAllIn 
        size_t   FindAllIn( CString strText, CWordPosPairList & rlstrWords ) ; // Iterate all at once and make list 
 
    protected: 
        DWORD (* m_apnFSM)[128] ;   // Finite State Machine. Array of 128 char arrays 
        size_t   m_nCurDim ;        // Dimension of allocated width of FSM 
        size_t   m_nUsedCols ;      // Used portion of allocated width 
        WORD     m_wMaxUsedState ;  // largest state value used 
        CString  m_strSearch ;      // Current search string 
        UINT     m_nCurTextChar ;   // Current position in search string 
 
        bool     InsertWord( LPCTSTR pszWord, WORD wIndex ) ; // put the new word into the FSM for given index 
        bool     SetColDim( size_t nNewDim ) ;                // set the current width to at least nNewDim columns 
 
    private: 
        // Hide several base class members that shouldn't be used 
        // Using these members could cause the index numbers of strings to change, throwing 
        //     off the embedded index entries in the FSM 
        void SetAt( int nIndex, LPCTSTR newElement ) ; 
        void SetAt( int nIndex, const CString & newElement ) ; 
        void SetAtGrow( int nIndex, LPCTSTR newElement ) ; 
        void SetAtGrow( int nIndex, const CString & newElement ) ; 
        int Append( const CStringArray & src ) ; 
        void Copy( const CStringArray & src ) ; 
        void InsertAt( int nIndex, LPCTSTR newElement, int nCount = 1 ) ; 
        void InsertAt( int nIndex, const CString & newElement, int nCount = 1 ) ; 
        void RemoveAt( int nIndex, int nCount = 1 ) ; 
        void InsertAt( int nStartIndex, CStringArray * pNewArray ) ; 
} ;