// GetDP - Copyright (C) 1997-2018 P. Dular and C. Geuzaine, University of Liege
//
// See the LICENSE.txt file for license information. Please report all
// issues on https://gitlab.onelab.info/getdp/getdp/issues

#ifndef _PRO_DEFINE_H_
#define _PRO_DEFINE_H_

#include "ProData.h"

struct StringXDefine {
  const char *string;
  int define;
};

struct StringXDefine1Nbr {
  const char *string;
  int define, Nbr1;
};

struct StringXPointer {
  const char *string;
  void *Pointer;
};

struct StringX3Function3Nbr {
  const char *string;
  void (*Function1)();
  void (*Function2)();
  void (*Function3)();
  double Nbr1;
  int Nbr2;
  int Nbr3;
};

struct DefineXFunction {
  int  define;
  void (*Function)();
};

struct StringXFunction2Nbr {
  const char *string;
  void (*Function)();
  int   Nbr1, Nbr2;
};

struct FunctionXFunction {
  void (*Function1)();
  void (*Function2)();
};

extern struct StringXDefine  Mesh_Format[];
extern struct StringXDefine  Field_Type[];
extern struct StringXDefine  FunctionForGroup_Type[];
extern struct StringXDefine  FunctionForGroup_SuppList[];
extern struct StringXDefine1Nbr  Jacobian_Type[];
extern struct StringXDefine  Integration_Type[];
extern struct StringXDefine  Integration_SubType[];
extern struct StringXDefine  Element_Type[];
extern struct StringXDefine  GlobalQuantity_Type[];
extern struct StringXDefine  Constraint_Type[];
extern struct StringXDefine  Formulation_Type[];
extern struct StringXDefine  Equation_SubType[];
extern struct StringXDefine  DefineQuantity_Type[];
extern struct StringXDefine  Operator_Type[];
extern struct StringXDefine  QuantityFromFS_Type[];
extern struct StringXDefine  DefineSystem_Type[];
extern struct StringXDefine  Operation_Type[];
extern struct StringXDefine  ChangeOfState_Type[];
extern struct StringXDefine  PostQuantityTerm_EvaluationType[];
extern struct StringXDefine  PostSubOperation_CombinationType[];
extern struct StringXDefine  PostSubOperation_Format[];
extern struct StringXDefine  PostSubOperation_FormatTag[];
extern struct StringXDefine  PostSubOperation_AdaptationType[];
extern struct StringXDefine  PostSubOperation_SortType[];

extern struct StringXPointer Current_Value[];

extern struct DefineXFunction  FunctionForGauss[];
extern struct DefineXFunction  FunctionForGaussLegendre[];
extern struct DefineXFunction  FunctionForSingularGauss[];

extern struct StringX3Function3Nbr BF_Function[];
extern struct StringXFunction2Nbr  F_Function[];
extern struct FunctionXFunction    GF_Function[];

const char *Get_StringForDefine(struct StringXDefine SXD[], int define);
int Get_DefineForString(struct StringXDefine SXD[], const char *string,
			int *FlagError);

const char *Get_StringForDefine1Nbr(struct StringXDefine1Nbr SXD[], int define);
int Get_Define1NbrForString(struct StringXDefine1Nbr SXD[], const char *string,
			      int *FlagError, int *Nbr1);

const char *Get_StringForPointer(struct StringXPointer SXF[], void *Pointer);
void Get_PointerForString(struct StringXPointer SXF[], const char *string,
			  int *FlagError, void **Pointer);

const char *Get_StringFor3Function3Nbr(struct StringX3Function3Nbr SXF[],
				       void (*Function1)());
void Get_3Function3NbrForString(struct StringX3Function3Nbr SXF[], const char *string,
				int *FlagError, void (**Function1)(),
				void (**Function2)(), void (**Function3)(),
				double *Nbr1, int *Nbr2, int *Nbr3);

void Get_FunctionForDefine(struct DefineXFunction DXF[], int define,
			   int *FlagError, void (**Function)());

void Get_Function2NbrForString(struct StringXFunction2Nbr SXF[], const char *string,
			       int *FlagError, void (**Function)(),
			       int *Nbr1, int *Nbr2);

void  Get_FunctionForFunction(struct FunctionXFunction  FXF[], void (*Function1)(),
			      int *FlagError, void (**Function2)() );

const char *Get_StringForFunction2Nbr(struct StringXFunction2Nbr SXF[], void (*Function)());

void Get_Valid_SXD(const char *value, struct StringXDefine V[]);
void Get_Valid_SXD1N(const char *value, struct StringXDefine1Nbr V[]);
void Get_Valid_SXP(const char *value, struct StringXPointer V[]);
void Get_Valid_SX3F3N(const char *value, struct StringX3Function3Nbr V[]);
void Get_Valid_SXF2N(const char *value, struct StringXFunction2Nbr V[]);

#endif
