/****************************************************************************
 * This file was derived from the CNCL library by the Pablo research group.
 *
 * The complete CNCL library is available at:
 *       http://www.comnets.rwth-aachen.de/doc/cncl.html
 *
 * The CNCL copyright notice is included here:
 *
 * |_|_|_  |_|_    |_    |_|_|_  |_               C O M M U N I C A T I O N
 *|_       |_  |_  |_  |_        |_                         N E T W O R K S
 *|_       |_  |_  |_  |_        |_                               C L A S S
 * |_|_|_  |_    |_|_    |_|_|_  |_|_|_|_                     L I B R A R Y
 *
 *
 *
 * Copyright (C) 1992-1998   Communication Networks
 *                           Aachen University of Technology
 *                           D-52056 Aachen
 *                           Germany
 *                           Email: cncl-adm@comnets.rwth-aachen.de
 *
 *
 * This library is free  software; you can  redistribute it and/or modify
 * it  under   the terms  of the GNU   Library  General Public License as
 * published by the  Free Software Foundation;  either  version 2 of  the
 * License, or  (at  your option)  any  later  version.  This  library is
 * distributed  in the  hope  that  it  will  be useful,  but WITHOUT ANY
 * WARRANTY;  without even the   implied  warranty of MERCHANTABILITY  or
 * FITNESS FOR A PARTICULAR PURPOSE.   See the GNU Library General Public
 * Library General Public License along with  this library; if not, write
 * to the Free Software Foundation,  675  Mass Ave, Cambridge, MA  02139,
 * USA.
 ****************************************************************************/

// -*- C++ -*-
/*****************************************************************************
 *
 * Class: FlArrayObject  --- 1 dimensional FlObjPtr array class
 *
 *****************************************************************************/

#ifndef __ArrayObject_h
#define __ArrayObject_h

#include <FlArray.h>


/*
 * The class FlArrayObject
 */

typedef FlObject *FlObjPtr;

class FlArrayObject : public FlArray
{
  public:	/***** Public interface **************************************/
    virtual void size(size_t sz=0);	// Set size of array

    void put(int index, FlObjPtr value)	// Put value into array
    {
#   ifndef NO_RANGE_CHECK
	if(index<0 || asize<=(size_t)index)
	    range_error(index);
	else
#   endif
	    array[index] = value;
    }

    FlObjPtr get(int index) const		// Get value from array
    {
#   ifndef NO_RANGE_CHECK
	if (index<0 || asize<=(size_t)index)
	{   range_error(index); return 0; }
	else
#   endif
	    return array[index];
    }

    FlObjPtr& operator[] (int index)	// Operator []
    {
#   ifndef NO_RANGE_CHECK
	if (index<0 || asize<=(size_t)index)
	    range_error(index);
#   endif
	return array[index];
    }

  private:	/***** Internal private members ******************************/
    friend class FlPArrayObject;
    
    FlObjPtr *array;			// Array of FlObjPtr
    FlObjPtr def_val;			// Default value
    
    void init(size_t sz);		// Initialize array
    void delete_array();                // Delete array

  public:	/***** Constructors ******************************************/
    FlArrayObject()          : FlArray((size_t)0), array(NIL), def_val(0) {}
    FlArrayObject(size_t sz, FlObjPtr def=0);
    FlArrayObject(const FlArrayObject &a);		// Copy constructor

    ~FlArrayObject();

    FlArrayObject &operator = (const FlArrayObject &a);
    

    // Print/debug output
    virtual void print(ostream &strm = cout) const;
    virtual void dump (ostream &strm = cout) const;
};

#endif /**__ArrayObject_h**/
