/* Basic data types for Objective C.
   Copyright (C) 1993-2021 Free Software Foundation, Inc.

This file is part of GCC.

GCC 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 3, or (at your option)
any later version.

GCC 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.

Under Section 7 of GPL version 3, you are granted additional
permissions described in the GCC Runtime Library Exception, version
3.1, as published by the Free Software Foundation.

You should have received a copy of the GNU General Public License and
a copy of the GCC Runtime Library Exception along with this program;
see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
<http://www.gnu.org/licenses/>.  */

#ifndef __objc_INCLUDE_GNU
#define __objc_INCLUDE_GNU

/* This file contains the definition of the basic types used by the
   Objective-C language.  It needs to be included to do almost
   anything with Objective-C.  */

#ifdef __cplusplus
extern "C" {
#endif

#include <stddef.h>

/* The current version of the GNU Objective-C Runtime library in
   compressed ISO date format.  This should be updated any time a new
   version is released with changes to the public API (there is no
   need to update it if there were no API changes since the previous
   release).  This macro is only defined starting with the GNU
   Objective-C Runtime shipped with GCC 4.6.0.  If it is not defined,
   it is either an older version of the runtime, or another runtime.  */
#define __GNU_LIBOBJC__ 20110608

/* Definition of the boolean type.

   Compatibility note: the Apple/NeXT runtime defines a BOOL as a
   'signed char'.  The GNU runtime uses an 'unsigned char'.

   Important: this could change and we could switch to 'typedef bool
   BOOL' in the future.  Do not depend on the type of BOOL.  */
#undef BOOL
typedef unsigned char  BOOL;

#define YES   (BOOL)1
#define NO    (BOOL)0

/* The basic Objective-C types (SEL, Class, id) are defined as pointer
   to opaque structures.  The details of the structures are private to
   the runtime and may potentially change from one version to the
   other.  */

/* A SEL (selector) represents an abstract method (in the
   object-oriented sense) and includes all the details of how to
   invoke the method (which means its name, arguments and return
   types) but provides no implementation of its own.  You can check
   whether a class implements a selector or not, and if you have a
   selector and know that the class implements it, you can use it to
   call the method for an object in the class.  */
typedef const struct objc_selector *SEL;

/* A Class is a class (in the object-oriented sense).  In Objective-C
   there is the complication that each Class is an object itself, and
   so belongs to a class too.  This class that a class belongs to is
   called its 'meta class'.  */
typedef struct objc_class *Class;

/* An 'id' is an object of an unknown class.  The way the object data
   is stored inside the object is private and what you see here is
   only the beginning of the actual struct.  The first field is always
   a pointer to the Class that the object belongs to.  */
typedef struct objc_object
{
  /* 'class_pointer' is the Class that the object belongs to.  In case
     of a Class object, this pointer points to the meta class.

     Compatibility Note: The Apple/NeXT runtime calls this field
     'isa'.  To access this field, use object_getClass() from
     runtime.h, which is an inline function so does not add any
     overhead and is also portable to other runtimes.  */
  Class class_pointer;
} *id;

/* 'IMP' is a C function that implements a method.  When retrieving
   the implementation of a method from the runtime, this is the type
   of the pointer returned.  The idea of the definition of IMP is to
   represent a 'pointer to a general function taking an id, a SEL,
   followed by other unspecified arguments'.  You must always cast an
   IMP to a pointer to a function taking the appropriate, specific
   types for that function, before calling it - to make sure the
   appropriate arguments are passed to it.  The code generated by the
   compiler to perform method calls automatically does this cast
   inside method calls.  */
typedef id (*IMP)(id, SEL, ...); 

/* 'nil' is the null object.  Messages to nil do nothing and always
   return 0.  */
#define nil (id)0

/* 'Nil' is the null class.  Since classes are objects too, this is
   actually the same object as 'nil' (and behaves in the same way),
   but it has a type of Class, so it is good to use it instead of
   'nil' if you are comparing a Class object to nil as it enables the
   compiler to do some type-checking.  */
#define Nil (Class)0

/* TODO: Move the 'Protocol' declaration into objc/runtime.h.  A
   Protocol is simply an object, not a basic Objective-C type.  The
   Apple runtime defines Protocol in objc/runtime.h too, so it's good
   to move it there for API compatibility.  */

/* A 'Protocol' is a formally defined list of selectors (normally
   created using the @protocol Objective-C syntax).  It is mostly used
   at compile-time to check that classes implement all the methods
   that they are supposed to.  Protocols are also available in the
   runtime system as Protocol objects.  */
#ifndef __OBJC__
  /* Once we stop including the deprecated struct_objc_protocol.h
     there is no reason to even define a 'struct objc_protocol'.  As
     all the structure details will be hidden, a Protocol basically is
     simply an object (as it should be).  */
  typedef struct objc_object Protocol;
#else /* __OBJC__ */
  @class Protocol;
#endif 

/* Compatibility note: the Apple/NeXT runtime defines sel_getName(),
   sel_registerName(), object_getClassName(), object_getIndexedIvars()
   in this file while the GNU runtime defines them in runtime.h.

   The reason the GNU runtime does not define them here is that they
   are not basic Objective-C types (defined in this file), but are
   part of the runtime API (defined in runtime.h).  */

#ifdef __cplusplus
}
#endif

#endif /* not __objc_INCLUDE_GNU */
