/*************************************************************************** copyright : (C) 2006 by David Nolden email : david.nolden.tdevelop@art-master.de ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #ifndef HASHED_STRING_H #define HASHED_STRING_H #include #include #include #include #include #include ///A simple class that stores a string together with it's appropriate hash-key class HashedString { public: HashedString() : m_hash( 0 ) {} HashedString( const TQString& str ) : m_str( str ) { initHash(); } HashedString( const char* str ) : m_str( str ) { initHash(); } inline size_t hash() const { return m_hash; } TQString str() const { return m_str; } bool operator == ( const HashedString& rhs ) const { if ( m_hash != rhs.m_hash ) return false; return m_str == rhs.m_str; } ///Does not compare alphabetically, uses the hash-key for ordering. bool operator < ( const HashedString& rhs ) const { if ( m_hash < rhs.m_hash ) return true; if ( m_hash == rhs.m_hash ) return m_str < rhs.m_str; return false; } static size_t hashString( const TQString& str ); private: void initHash(); TQString m_str; size_t m_hash; friend TQDataStream& operator << ( TQDataStream& stream, const HashedString& str ); friend TQDataStream& operator >> ( TQDataStream& stream, HashedString& str ); }; TQDataStream& operator << ( TQDataStream& stream, const HashedString& str ); TQDataStream& operator >> ( TQDataStream& stream, HashedString& str ); class HashedStringSetData; class HashedStringSetGroup; ///This is a reference-counting string-set optimized for fast lookup of hashed strings class HashedStringSet { public: HashedStringSet(); ~HashedStringSet(); ///Constructs a string-set from one single file HashedStringSet( const HashedString& file ); HashedStringSet( const HashedStringSet& rhs ); int size() const; HashedStringSet& operator = ( const HashedStringSet& rhs ); ///@return whether the given file-name was included bool operator[] ( const HashedString& rhs ) const; void insert( const HashedString& str ); HashedStringSet& operator +=( const HashedStringSet& ); HashedStringSet& operator -=( const HashedStringSet& ); ///intersection-test ///Returns true if all files that are part of this set are also part of the given set bool operator <= ( const HashedStringSet& rhs ) const; bool operator == ( const HashedStringSet& rhs ) const; void read( TQDataStream& stream ); void write( TQDataStream& stream ) const; std::string print() const; size_t hash() const; private: friend class HashedStringSetGroup; void makeDataPrivate(); TDESharedPtr m_data; //this implies some additional cost because TDEShared's destructor is virtual. Maybe change that by copying TDEShared without the virtual destructor. friend HashedStringSet operator + ( const HashedStringSet& lhs, const HashedStringSet& rhs ); }; HashedStringSet operator + ( const HashedStringSet& lhs, const HashedStringSet& rhs ); namespace __gnu_cxx { template<> struct hash { size_t operator () ( const HashedString& str ) const { return str.hash(); } }; } ///Used to find all registered HashedStringSet's that contain all strings given to findGroups(..) class HashedStringSetGroup { public: typedef std::set ItemSet; void addSet( size_t id, const HashedStringSet& set ); void enableSet( size_t id ); bool isDisabled( size_t id ) const; void disableSet( size_t id ); void removeSet( size_t id ); //Writes the ids of all registered and not disabled HashedStringSet's that are completely included in the given HashedStringSet efficiently) void findGroups( HashedStringSet strings, ItemSet& target ) const; private: typedef __gnu_cxx::hash_map GroupMap; typedef __gnu_cxx::hash_map SizeMap; GroupMap m_map; SizeMap m_sizeMap; ItemSet m_disabled; ItemSet m_global; }; #endif