/*
    This file is part of the FElt finite element analysis package.
    Copyright (C) 1993-2000 Jason I. Gobat and Darren C. Atkinson

    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.

    This program 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 General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/

/************************************************************************
 * File:	array.c							*
 *									*
 * Description:	This file contains the function definitions for array	*
 *		blocks.							*
 ************************************************************************/

# include "allocate.h"
# include "descriptor.h"


/************************************************************************
 * Function:	CreateArray						*
 *									*
 * Description:	Creates, initializes, and returns a new array block.	*
 *		The size of an element is determined from the type.  By	*
 *		default the array is not temporary.			*
 ************************************************************************/

Array CreateArray (ptr, type, length, handler)
    void *ptr;
    int   type;
    int   length;
    int   handler;
{
    Array array;


    array = New (struct array);

    array -> ptr	= ptr;
    array -> temp	= F_False;
    array -> type	= type;
    array -> length	= length;
    array -> handler	= handler;
    array -> ref_count	= 1;


    switch (type) {
    case T_String:
	array -> elt_size = sizeof (char *);
	break;


    case T_Double:
	array -> elt_size = sizeof (double);
	break;


    case T_Int:
	array -> elt_size = sizeof (int);
	break;


    case T_Byte:
	array -> elt_size = sizeof (char);
	break;


    case T_Matrix:
	array -> elt_size = sizeof (Matrix);
	break;


    case T_MatrixPtr:
    case T_Constraint:
    case T_Definition:
    case T_Element:
    case T_Force:
    case T_Load:
    case T_Material:
    case T_Node:
	array -> elt_size = sizeof (void *);
	break;


    case T_Pair:
	array -> elt_size = sizeof (struct {unsigned u; double m;});
	break;


    default:
	array -> elt_size = 0;
	break;
    }


    return array;
}


/************************************************************************
 * Function:	CopyArray						*
 *									*
 * Description:	Creates a copy of an array.				*
 ************************************************************************/

Array CopyArray (array)
    Array array;
{
    array -> ref_count ++;
    return array;
}


/************************************************************************
 * Function:	DestroyArray						*
 *									*
 * Description:	Destroys an array block.  The array itself is not	*
 *		deallocated unless it is temporary.			*
 ************************************************************************/

void DestroyArray (array)
    Array array;
{
    if (! -- array -> ref_count) {
	if (array -> temp)
	    Deallocate (array -> ptr);

	Delete (array);
    }
}


syntax highlighted by Code2HTML, v. 0.9.1