/****************************************************************************
 *                                                                          *
 *                         GNAT COMPILER COMPONENTS                         *
 *                                                                          *
 *                               N L I S T S                                *
 *                                                                          *
 *                              C Header File                               *
 *                                                                          *
 *            Copyright (C) 1992-2011, 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 3,  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 along with GCC; see the file COPYING3.  If not see        *
 * <http://www.gnu.org/licenses/>.                                          *
 *                                                                          *
 * 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 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.  */

#ifdef __cplusplus
extern "C" {
#endif

/*  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;
}

#ifdef __cplusplus
}
#endif
