/****************************************************************************
 *                                                                          *
 *                         GNAT COMPILER COMPONENTS                         *
 *                                                                          *
 *                               N L I S T S                                *
 *                                                                          *
 *                              C Header File                               *
 *                                                                          *
 *          Copyright (C) 1992-2003, Free Software Foundation, Inc.         *
 *                                                                          *
 * GNAT is free software;  you can  redistribute it  and/or modify it under *
 * terms of the  GNU General Public License as published  by the Free Soft- *
 * ware  Foundation;  either version 2,  or (at your option) any later ver- *
 * sion.  GNAT is distributed in the hope that it will be useful, but WITH- *
 * OUT 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  distributed with GNAT;  see file COPYING.  If not, write *
 * to  the  Free Software Foundation,  51  Franklin  Street,  Fifth  Floor, *
 * Boston, MA 02110-1301, USA.                                              *
 *                                                                          *
 * GNAT was originally developed  by the GNAT team at  New York University. *
 * Extensive contributions were provided by Ada Core Technologies Inc.      *
 *                                                                          *
 ****************************************************************************/

/* This is the C header corresponding to the Ada package specification for
   Nlists. It also contains the implementations of inlined functions from the
   the package body for Nlists.  It was generated manually from nlists.ads and
   nlists.adb and must be kept synchronized with changes in these files.

   Note that only routines for reading the tree are included, since the
   tree transformer is not supposed to modify the tree in any way. */

/*  The following is the structure used for the list headers table */

struct List_Header
{
  Node_Id first;
  Node_Id last;
  Node_Id parent;
};

/* The list headers are stored in an array.  The pointer to this array is
   passed as a parameter to gigi and stored in the global variable
   List_Headers_Ptr.  */

extern struct List_Header *List_Headers_Ptr;

/* The previous and next links for lists are held in two arrays, Next_Node and
   Prev_Node.  The pointers to these arrays are passed as parameters to gigi
   and stored in the global variables Prev_Node_Ptr and Next_Node_Ptr.  */

extern Node_Id *Next_Node_Ptr;
extern Node_Id *Prev_Node_Ptr;

/* Node List Access Functions */

static Node_Id First (List_Id);

INLINE Node_Id
First (List_Id List)
{
  return List_Headers_Ptr[List - First_List_Id].first;
}

#define First_Non_Pragma nlists__first_non_pragma
extern Node_Id First_Non_Pragma (Node_Id);

static Node_Id Last (List_Id);

INLINE Node_Id
Last (List_Id List)
{
  return List_Headers_Ptr[List - First_List_Id].last;
}

#define First_Non_Pragma nlists__first_non_pragma
extern Node_Id First_Non_Pragma (List_Id);

static Node_Id Next (Node_Id);

INLINE Node_Id
Next (Node_Id Node)
{
  return Next_Node_Ptr[Node - First_Node_Id];
}

#define Next_Non_Pragma nlists__next_non_pragma
extern Node_Id Next_Non_Pragma (List_Id);

static Node_Id Prev (Node_Id);

INLINE Node_Id
Prev (Node_Id Node)
{
  return Prev_Node_Ptr[Node - First_Node_Id];
}


#define Prev_Non_Pragma nlists__prev_non_pragma
extern Node_Id Prev_Non_Pragma		(Node_Id);

static Boolean Is_Empty_List		(List_Id);
static Boolean Is_Non_Empty_List	(List_Id);
static Boolean Is_List_Member		(Node_Id);
static List_Id List_Containing		(Node_Id);

INLINE Boolean
Is_Empty_List (List_Id Id)
{
  return (First (Id) == Empty);
}

INLINE Boolean
Is_Non_Empty_List (List_Id Id)
{
  return (Present (Id) && First (Id) != Empty);
}

INLINE Boolean
Is_List_Member (Node_Id Node)
{
  return Nodes_Ptr[Node - First_Node_Id].U.K.in_list;
}

INLINE List_Id
List_Containing (Node_Id Node)
{
  return Nodes_Ptr[Node - First_Node_Id].V.NX.link;
}
