/* Constraints.h -- C++ header file for KSI Constraint Graphs
*/
/*
 *
 * Copyright (c) 1996
 * Knowledge Science Institute, University of Calgary
 *
 * Permission to use, copy, modify, distribute and sell this software
 * and its documentation for any purpose is hereby granted without fee,
 * provided that the above copyright notice appear in all copies and
 * that both that copyright notice and this permission notice appear
 * in supporting documentation.  The Knowledge Science Institute makes no
 * representations about the suitability of this software for any
 * purpose.  It is provided "as is" without express or implied warranty.
 *
 */

#ifndef CONSTRAINTS
#define CONSTRAINTS

#ifndef GRAPHS_H
#include 
#endif

#ifndef MOBJECT_H
#include 
#endif

void initConstraintLibrary();

/*
  Z spec */
class Validator //:public binary_function
  {
  public:
    typedef enum {silent=0x1} Flags;
    typedef enum {node=0x1,arc=0x2} Applicability_types;
    Validator() {}
    Validator(const Validator& a) {}
    virtual bool operator()(Component0& apply, Component0& owner, TypedGraph& g, unsigned long flags=0) {return true;}
    virtual Validator* clone() const {return new Validator(*this);}
    virtual int operator< (const Validator& r) {return name()>(istream& i, Validator& t) {return t.readFrom(i);};

#define DECL_VALIDATOR(className,applicable) \
class className : public Validator \
  { \
  public: \
    className() {} \
    className(const className& a) : Validator(a) {} \
    virtual Validator* clone() const {return new className(*this);} \
    virtual const string name() const {return string(#className);} \
    virtual bool operator()(Component0& apply, Component0& owner, TypedGraph& g, unsigned long flags=0); \
    virtual unsigned long applicability() const {return applicable;} \
    virtual const string doc() const; \
    virtual const string spec() const; \
  };

class EditableValidator : public Validator, public EditableObject
  {
  public:
    EditableValidator() : Validator() {}
    EditableValidator(const EditableValidator& a) : Validator(a) {}
    virtual Validator* clone() const {return new EditableValidator(*this);}
  };

ostream& operator<<(ostream& o, const EditableValidator& v) {return o << (const Validator&)v;}
istream& operator>>(istream& i, EditableValidator& v) {return i >> (Validator&)v;}

class ConjunctionOfValidators : public EditableValidator, public list >
  {
  public:
    ConjunctionOfValidators() {}
    ConjunctionOfValidators(const ConjunctionOfValidators& a) : EditableValidator(a), list >(a) {}
    virtual Validator* clone() const {return new ConjunctionOfValidators(*this);}
    virtual int operator< (const ConjunctionOfValidators& r) {return ((list >)*this)<(list >)r;}
    virtual bool operator()(Component0& apply, Component0& owner, TypedGraph& g, unsigned long flags=0);
    virtual const string name() const {return string("ConjunctionOfValidators");}
    virtual const string doc() const;
    virtual const string spec() const;
    virtual int edit() {return edit(0xFFFFFFFF);}
    virtual int edit(unsigned long filter);
    virtual ostream& printOn(ostream& o) const;
    virtual istream& readFrom(istream& i);
  };

#endif
/*


*/