// This may look like C code, but it is really -*- C++ -*-
// RTSS --- Railway Total System Simulator
// (c) TAKAGI Ryo (at Prof. SONE's Laboratory, the Univ. of Tokyo.)
// RefTable.hh --- template class RefTable
// $Id: table.hh,v 2.4 1994/12/27 12:03:47 rt Exp $

#ifndef ___REFTABLE_HH
#define ___REFTABLE_HH

#include "NoRefTable.hh"

// 参照を返すテンプレート・コンテナクラス
template < class TP >
class RefTable
  : public NoRefTable < TP >
{

private :
  void error26_name() const
  {
    cerr << "Error: subscript out of range in "
	 << " RefTable object TP data call" << endl ;
  }	// エラーメッセージ……モノによって話が異なる

public :

  // empty constructor
  RefTable () : NoRefTable < TP > () {}

  // X(X)&
  RefTable ( const RefTable < TP > & x ) : NoRefTable < TP > ( x ) {}

  // destructor は暗黙に定義されるものを用いる。改めて定義しない

  // 配列データの参照
  TP & operator[] ( int i ) {
    if ( i < 0 || i >= NoRefTable < TP > :: num ) {
      error26_name () ;	// エラーメッセージ
      exit ( 26 ) ;
    }
    return NoRefTable < TP > :: data [ i ] ;
  }
  TP const & operator[] ( int i ) const {
    if ( i < 0 || i >= NoRefTable < TP > :: num ) {
      error26_name () ;	// エラーメッセージ
      exit ( 26 ) ;
    }
    return NoRefTable < TP > :: data [ i ] ;
  }

  TP & last ()
  { return operator[] ( NoRefTable < TP > :: num - 1 ) ; }
  TP const & last () const
  { return operator[] ( NoRefTable < TP > :: num - 1 ) ; }

  TP lastelement () const { return element( NoRefTable < TP > :: num - 1 ) ; }
  TP firstelement () const { return element ( 0 ) ; }

  // 配列データの参照
  TP element ( int i ) const {
    if ( i < 0 || i >= NoRefTable < TP > :: num ) {
      error26_name () ;	// エラーメッセージ
      exit ( 26 ) ;
    }
    return NoRefTable < TP > :: data [ i ] ;
  }
} ;

#endif /* ! ___REFTABLE_HH */
