/* /% C++ %/ */
/***********************************************************************
 * cint (C/C++ interpreter)
 ************************************************************************
 * Header file Api.h
 ************************************************************************
 * Description:
 *  Extended Run Time Type Identification API
 *   -I$(CINTSYSDIR) -I$(CINTSYSDIR)/src must be given at compile time
 ************************************************************************
 * Copyright(c) 1995~1999  Masaharu Goto
 *
 * For the licensing terms see the file COPYING
 *
 ************************************************************************/

#ifndef G__API_H
#define G__API_H

/*********************************************************************
* include header files
*********************************************************************/

#define G__API
#include "G__ci.h"
#ifdef __MAKECINT__
#pragma link off all classes;
#pragma link off all functions;
#pragma link off all globals;
#pragma link off all typedefs;
#endif

#define G__INFO_BUFLEN 50
/* #define G__INFO_TITLELEN 256 */
#define G__INFO_TITLELEN G__ONELINE

#include "Property.h"
#include "Class.h"
#include "BaseCls.h"
#include "Type.h"
#include "Method.h"
#include "MethodAr.h"
#include "DataMbr.h"
#include "CallFunc.h"
#include "Typedf.h"
#include "Token.h"

#ifndef __CINT__
struct G__includepath;
#endif

namespace Cint {

/*********************************************************************
* $xxx object resolution function, pointer to a class object
*
* Usage:
*
*  void YourGetObject(char *name,G__ClassInfo *type) {
*     void *p;
*     // Whatever you want to fill type and pointetr to the object info
*     return(p);
*  }
*
*  ROOT_Initialization() {
*     // set pointer to yourown interface method
*     G__InitGetSpecialObject(YourGetObject);
*  }
*********************************************************************/
typedef void *(*G__pMethodSpecialObject)(char *item,G__ClassInfo *typeinfo
                                         ,void** pptr,void** ppdict);
#ifndef __CINT__
G__EXPORT
#endif
void G__InitGetSpecialObject(G__pMethodSpecialObject pmethod);

/*********************************************************************
* $xxx object resolution function, Generic
*********************************************************************/
typedef void (*G__pMethodSpecialValue)(char *item,G__TypeInfo *typeinfo
                                       ,long *pl,double *pd,void** pptr
                                       ,void** ppdict);
#ifndef __CINT__
G__EXPORT
#endif
void G__InitGetSpecialValue(G__pMethodSpecialValue pmethod);


#ifndef __CINT__
G__EXPORT
#endif
int G__SetGlobalcomp(char *funcname,char *param,int globalcomp); // Method.cxx

#ifndef __CINT__
G__EXPORT
#endif
int G__ForceBytecodecompilation(char *funcname,char *param); // Method.cxx

/*********************************************************************
* Feedback routine in case tagnum for a class changes (in case the
* dictionary of a shared lib is being re-initialized).
*********************************************************************/
typedef void (*G__pMethodUpdateClassInfo)(char *item,long tagnum);

#ifndef __CINT__
G__EXPORT
#endif
void G__InitUpdateClassInfo(G__pMethodUpdateClassInfo pmethod);

#ifndef __CINT__
G__EXPORT
#endif
void* G__new_interpreted_object(int size);

#ifndef __CINT__
G__EXPORT
#endif
void G__delete_interpreted_object(void* p);


/*********************************************************************
* G__SourceFileInfo
*********************************************************************/
class
#ifndef __CINT__
G__EXPORT
#endif
G__SourceFileInfo {
 public:
  G__SourceFileInfo(): filen(0) { Init(); }
  G__SourceFileInfo(int filenin): filen(filenin) { }
  G__SourceFileInfo(const char* fname): filen(0) { Init(fname); }
  ~G__SourceFileInfo() { }
  void Init() {
    filen = -1;
  }
  void Init(const char* fname);
  const char *Name();
  const char *Prepname();
  FILE* fp();
  int MaxLine();
  G__SourceFileInfo& IncludedFrom();
  long Property();
  int IsValid();
  int Next();
 private:
  int filen;
};

/*********************************************************************
* G__IncludePathInfo
*********************************************************************/
class
#ifndef __CINT__
G__EXPORT
#endif
G__IncludePathInfo {
 public:
  G__IncludePathInfo(): p(NULL) { Init(); }
#ifndef __CINT__
  G__IncludePathInfo(const G__IncludePathInfo& ipf): p(ipf.p) {}
#endif
  ~G__IncludePathInfo() { }
  void Init() { p=(struct G__includepath*)NULL; }
  const char *Name();
  long Property();
  int IsValid();
  int Next();
 private:
  G__IncludePathInfo& operator=(const G__IncludePathInfo&);
#ifndef __CINT__
  struct G__includepath *p;
#endif
};

#ifdef G__EXCEPTIONWRAPPER
/*********************************************************************
* G__ExceptionWrapper
*********************************************************************/
int G__ExceptionWrapper(G__InterfaceMethod funcp
                        ,G__value* result7
                        ,char* funcname
                        ,struct G__param *libp
                        ,int hash);
#endif

unsigned long G__long_random(unsigned long limit);
   
} // namespace Cint

using namespace Cint;

#ifdef __MAKECINT__
#pragma link off class $G__value;
#pragma link off class $G__COMPLETIONLIST;
#pragma link off class $G__linked_taginfo;
#pragma link off class G__includepath;
#pragma link C++ namespace Cint;
#pragma link off namespace Cint::Internal;
#endif

#endif
