keep working on C++ interface.

This commit is contained in:
Vítor Santos Costa 2014-05-04 22:31:22 +01:00
parent 53bb9928eb
commit a2e141482c
2 changed files with 549 additions and 466 deletions

View File

@ -408,7 +408,7 @@ int YAPPredicate::call(YAPTerm t[])
return ret; return ret;
} }
YAP::YAP(YAPParams const& params) YAPEngine::YAPEngine(YAPParams const& params)
{ YAP_Init( (YAP_init_args *)&params.init_args ); } { YAP_Init( (YAP_init_args *)&params.init_args ); }

View File

@ -1,9 +1,26 @@
#define YAP_CPP_INTERFACE 1 #define YAP_CPP_INTERFACE 1
/**
*
* @defgroup yap-cplus-interface An object oriented interface for YAP.
*
*
* @tableofcontents
*
*
* C++ interface to YAP. Designed to be object oriented and to fit naturally
* with the swig interface language generator. It uses ideas from the old YAP
* interface and from the SWI foreign language interface.
*
*/
#include <stdlib.h> #include <stdlib.h>
#include <config.h>
#if USE_GMP
#include <gmp.h> #include <gmp.h>
#endif
extern "C" { extern "C" {
@ -43,18 +60,24 @@ extern "C" {
#include <windows.h> #include <windows.h>
#endif #endif
// taken from yap_structs.h // taken from yap_structs.h
#include "iopreds.h" #include "iopreds.h"
// we cannot consult YapInterface.h, that conflicts with what we declare, though // we cannot consult YapInterface.h, that conflicts with what we declare, though
// it shouldn't // it shouldn't
} }
//#include <vector>
class YAPEngine;
class YAPTermHandle; class YAPTermHandle;
class YAPAtom; class YAPAtom;
class YAPFunctor; class YAPFunctor;
class YAPQuery; class YAPQuery;
/**
* @brief Generic Prolog Term
*/
class YAPTerm { class YAPTerm {
friend class YAPPredicate; friend class YAPPredicate;
friend class YAPTermHandle; friend class YAPTermHandle;
@ -63,8 +86,7 @@ class YAPTerm {
protected: protected:
Term t; Term t;
public: public:
YAPTerm() {} // do nothing constructor YAPTerm() { t = TermNil; } // do nothing constructor
YAPTerm(int i) { CACHE_REGS t = MkIntegerTerm( i ); }
YAPTerm(void *ptr) { CACHE_REGS t = MkIntegerTerm( (Int)ptr ); } YAPTerm(void *ptr) { CACHE_REGS t = MkIntegerTerm( (Int)ptr ); }
YAPTerm(Term tn) { t = tn; } YAPTerm(Term tn) { t = tn; }
YAPTerm(char *s) { Term tp ; t = YAP_ReadBuffer(s,&tp); } YAPTerm(char *s) { Term tp ; t = YAP_ReadBuffer(s,&tp); }
@ -88,6 +110,9 @@ public:
bool isString() { return IsStringTerm(t); } bool isString() { return IsStringTerm(t); }
}; };
/**
* @brief Variable Term
*/
class YAPVarTerm: private YAPTerm { class YAPVarTerm: private YAPTerm {
public: public:
YAPVarTerm(): YAPTerm() { CACHE_REGS t = MkVarTerm(); } YAPVarTerm(): YAPTerm() { CACHE_REGS t = MkVarTerm(); }
@ -95,6 +120,9 @@ public:
bool unbound() { return IsUnboundVar(VarOfTerm(t)); } bool unbound() { return IsUnboundVar(VarOfTerm(t)); }
}; };
/**
* @brief Compound Term
*/
class YAPApplTerm: private YAPTerm { class YAPApplTerm: private YAPTerm {
public: public:
YAPApplTerm(YAPFunctor f, YAPTerm ts[]); YAPApplTerm(YAPFunctor f, YAPTerm ts[]);
@ -103,6 +131,9 @@ public:
YAPTerm getArg(unsigned int i); YAPTerm getArg(unsigned int i);
}; };
/**
* @brief List Constructor Term
*/
class YAPPairTerm: private YAPTerm { class YAPPairTerm: private YAPTerm {
public: public:
YAPPairTerm(YAPTerm hd, YAPTerm tl); YAPPairTerm(YAPTerm hd, YAPTerm tl);
@ -111,6 +142,31 @@ public:
YAPTerm getTail() { return YAPTerm(TailOfTerm(t)); } YAPTerm getTail() { return YAPTerm(TailOfTerm(t)); }
}; };
/**
* @brief Integer Term
*/
class YAPIntegerTerm: private YAPTerm {
public:
YAPIntegerTerm(intptr_t i) { CACHE_REGS t = MkIntegerTerm( i ); }
intptr_t getInteger(YAPIntegerTerm t) { return IntegerOfTerm(t.t); }
bool isTagged(YAPIntegerTerm i) { return IsIntTerm( t ); }
};
/*
class YAPListTerm: private YAPPairTerm {
public:
YAPListTerm(YAPTerm ts[], size_t n);
YAPListTerm(Term ts[], size_t n);
YAPListTerm( vector<YAPTerm> v );
size_t length() { Term *tailp; return Yap_SkipList(&t, &tailp); }
vector<YAPTerm> toVector();
};
*/
/**
* @brief Atom
*/
class YAPAtom { class YAPAtom {
friend class YAPPredicate; friend class YAPPredicate;
friend class YAPFunctor; friend class YAPFunctor;
@ -125,6 +181,9 @@ public:
char *name(void); char *name(void);
}; };
/**
* @brief String Term
*/
class YAPStringTerm: private YAPTerm { class YAPStringTerm: private YAPTerm {
public: public:
YAPStringTerm(char *s) ; YAPStringTerm(char *s) ;
@ -134,6 +193,9 @@ public:
const char *getString() { return StringOfTerm(t); } const char *getString() { return StringOfTerm(t); }
}; };
/**
* @brief Atom Term
*/
class YAPAtomTerm: private YAPTerm { class YAPAtomTerm: private YAPTerm {
public: public:
YAPAtomTerm(YAPAtom a): YAPTerm() { t = MkAtomTerm(a.a); } YAPAtomTerm(YAPAtom a): YAPTerm() { t = MkAtomTerm(a.a); }
@ -145,6 +207,9 @@ public:
YAPAtom getAtom() { return YAPAtom(AtomOfTerm(t)); } YAPAtom getAtom() { return YAPAtom(AtomOfTerm(t)); }
}; };
/**
* @brief Functor
*/
class YAPFunctor { class YAPFunctor {
friend class YAPApplTerm; friend class YAPApplTerm;
friend class YAPPredicate; friend class YAPPredicate;
@ -164,6 +229,9 @@ public:
} }
}; };
/**
* @brief Term Handle
*/
class YAPTermHandle { class YAPTermHandle {
long int handle; long int handle;
public: public:
@ -187,6 +255,9 @@ public:
} }
}; };
/**
* @brief Predicate
*/
class YAPPredicate { class YAPPredicate {
friend class YAPQuery; friend class YAPQuery;
PredEntry *ap; PredEntry *ap;
@ -259,8 +330,12 @@ public:
int call(YAPTerm ts[]); int call(YAPTerm ts[]);
}; };
/// interface to a YAP Query /**
/// uses an SWI-like status info internally * @brief Term Handle
*
* interface to a YAP Query;
* uses an SWI-like status info internally.
*/
class YAPQuery: private YAPPredicate { class YAPQuery: private YAPPredicate {
int q_open; int q_open;
int q_state; int q_state;
@ -286,13 +361,21 @@ public:
class YAPParams; class YAPParams;
class YAP { /**
* @brief YAP Constructor
*
*/
class YAPEngine {
public: public:
YAP(YAPParams const& params); YAPEngine(YAPParams const& params);
}; };
/**
* @brief Parameters for YAP Constructor
*
*/
class YAPParams { class YAPParams {
friend YAP; friend class YAPEngine;
YAP_init_args init_args; YAP_init_args init_args;
public: public:
YAPParams(); YAPParams();