text: /**
   * @file hashccObjHashMap.h
   * @author Christian (graetz23@gmail.com)
   *
   * HASHCC is distributed under the MIT License (MIT); this file is part of.
   *
   * Copyright (c) 2008-2018 Christian (graez23@gmail.com)
   *
   * Permission is hereby granted, free of charge, to any person obtaining a copy
   * of this software and associated documentation files (the "Software"), to deal
   * in the Software without restriction, including without limitation the rights
   * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
   * copies of the Software, and to permit persons to whom the Software is
   * furnished to do so, subject to the following conditions:
   *
   * The above copyright notice and this permission notice shall be included in
   * all copies or substantial portions of the Software.
   *
   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
   * THE SOFTWARE.
   */
  
  #ifndef __hashccObjHashMap_h__
  #define __hashccObjHashMap_h__
  
  /******************************************************************************/
  
  #include "./hashccTyp.h" // HASHCC data types
  
  /******************************************************************************/
  
  namespace HASHCC {
  
  namespace OBJ {
  
  /******************************************************************************/
  
  #define _DEBUG_HASHCC_OBJ_HashMap_
  
  /******************************************************************************/
  
  typedef HASHCC::TYP::Tree           Tree;           // namespace typedef
  typedef HASHCC::TYP::TreeController TreeController; // namespace typedef
  
  /******************************************************************************/
  
  /// class as pattern for following classes
  template<typename K, typename V>
  class HashMap {
   public:
  
    HashMap( void ); /// constructor
    virtual ~HashMap( void ); /// destructor
  
    Int32 size( void ); /// returns the number of stored objects
  
    virtual V get( K key ) = 0; /// returns a stored object or throw ERR::Failure
  
    virtual V* put( K key, V value ) = 0; /// stores an object by key; returns an object pointer if key is occupied
  
   protected:
  
    // TODO think: why GNU/g++ does not allow to push those member up in heredity
    Int32  _noOfVal; /// no of stored objects
    uInt16 _keySize; /// the used key size
    Tree*  _tree; /// the used tree
    TreeController* _treeC; /// the tree controller for it
  
  }; // class HashMap
  
  /******************************************************************************/
  
  template<typename K, typename V> /// constructor
  HashMap< K, V >::HashMap( void ) {
    TYP::keyTest<K>( ); // throws ERR::Error if key data type is not available
    this->_noOfVal = 0; // set number of stored data objects to zero
    this->_treeC = new TreeController( ); // create a the tree controller
  } // HashMap
  
  template<typename K, typename V> /// destructor
  HashMap< K, V >::~HashMap( void ) {
    // member _treeC is deleted in heritating destructor
  } // ~HashMap
  
  /******************************************************************************/
  
  template<typename K, typename V>
  Int32 /// returns the no of stored objects
  HashMap< K, V >::size( void ) {
    return this->_noOfVal;
  } // HashMap<T>::size
  
  /******************************************************************************/
  
  } // namespace OBJ
  
  } // namespace HASHCC
  
  /******************************************************************************/
  
  #endif // __hashccObjHashMap_h__
  