// @(#)root/meta:$Id$
// Author: Fons Rademakers   07/02/97

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifndef ROOT_TFunction
#define ROOT_TFunction


//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TFunction                                                            //
//                                                                      //
// Dictionary of global functions.                                      //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "TDictionary.h"

#include <string>

class TMethodCall;

class TFunction : public TDictionary {

friend class TCling;
friend class TMethodCall;

protected:
   MethodInfo_t   *fInfo;            //pointer to Interpreter function info
   TString         fMangledName;     //Mangled name as determined by CINT.
   TString         fSignature;       //string containing function signature
   TList          *fMethodArgs;      //list of function arguments

   virtual void    CreateSignature();

public:
   TFunction(MethodInfo_t *info = nullptr);
   TFunction(const TFunction &orig);
   TFunction& operator=(const TFunction &rhs);
   virtual            ~TFunction();

   TObject            *Clone(const char *newname="") const override;
   virtual const char *GetMangledName() const;
   virtual const char *GetPrototype() const;
   const char         *GetSignature();
   const char         *GetReturnTypeName() const;
   std::string         GetReturnTypeNormalizedName() const;
   TList              *GetListOfMethodArgs();
   Int_t               GetNargs() const;
   Int_t               GetNargsOpt() const;
   DeclId_t            GetDeclId() const;
   void               *InterfaceMethod() const;
   virtual Bool_t      IsValid();
   void                Print(Option_t *option="") const override;
   Long_t              Property() const override;
   Long_t              ExtraProperty() const;
   virtual bool        Update(MethodInfo_t *info);

   void                ls(Option_t *option="") const override;

   ClassDefOverride(TFunction,0)  //Dictionary for global function
};

#endif
