Guest User

Untitled

a guest
May 3rd, 2014
232
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.79 KB | None | 0 0
  1.  #ifndef CONTAINER_H
  2.  #define CONTAINER_H
  3.  
  4.  // Container.h
  5.  //
  6.  // UE Algorithmen und Datenstrukturen - SS 2014 Universitaet Wien
  7.  // Container - Projekt
  8.  // https://cewebs.cs.univie.ac.at/ADS/ss14/
  9.  
  10.  #include <iostream>
  11.  
  12.  enum Order { dontcare, ascending, descending };
  13.  template <typename E> class Functor;
  14.  
  15.  class ContainerException : public std::exception {
  16.  public:
  17.    virtual const char* what() const throw() = 0;
  18.  };
  19.  
  20.  template <typename E>
  21.  class Container {
  22.    Container& operator=( const Container<E>& );
  23.    Container( const Container<E>& );
  24.  public:
  25.    Container( ) { }
  26.    virtual ~Container( ) { }
  27.  
  28.    virtual void add( const E& e ) { add( &e, 1 ); }
  29.    virtual void add( const E e[], size_t s ) = 0;
  30.  
  31.    virtual void remove( const E& e ) { remove( &e, 1 ); }
  32.    virtual void remove( const E e[], size_t s ) = 0;
  33.  
  34.    virtual bool member( const E& e ) const = 0;
  35.    virtual size_t size( ) const = 0;
  36.    virtual bool empty( ) const { return size( ) == 0; }
  37.  
  38.    virtual size_t apply( const Functor<E>& f, Order order = dontcare ) const = 0;
  39.  
  40.    virtual E min( ) const = 0;
  41.    virtual E max( ) const = 0;
  42.  
  43.    virtual std::ostream& print( std::ostream& o ) const = 0;
  44.  };
  45.  
  46.  template <typename E>
  47.  inline std::ostream& operator<<( std::ostream& o, const Container<E>& c ) { return c.print( o ); }
  48.  
  49.  template <typename E>
  50.  class Functor {
  51.  public:
  52.    virtual bool operator( )( const E& e ) const = 0;
  53.    virtual ~Functor( ) {}
  54.  };
  55.  
  56.  template <typename E> inline unsigned long hashValue( const E& e ) { return (unsigned long) e * 47114711UL; }
  57.  template <typename E> inline double doubleValue( const E& e ) { return double( e ); }
  58.  template <typename E> inline unsigned long ordinalValue( const E& e ) { return (unsigned long) e; }
  59.  
  60.  #endif //CONTAINER_H
Advertisement
Add Comment
Please, Sign In to add comment