3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-10 19:27:06 +00:00
z3/lib/dl_table_plugin.h
Leonardo de Moura e9eab22e5c Z3 sources
Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
2012-10-02 11:35:25 -07:00

194 lines
5.2 KiB
C++

/*++
Copyright (c) 2006 Microsoft Corporation
Module Name:
dl_table_plugin.h
Abstract:
<abstract>
Author:
Krystof Hoder (t-khoder) 2010-09-23.
Revision History:
--*/
#ifndef _DL_TABLE_PLUGIN_H_
#define _DL_TABLE_PLUGIN_H_
#include"ast.h"
#include"map.h"
#include"vector.h"
#include"dl_table_ops.h"
namespace datalog {
/**
Termplate class containing common infrastructure for relations and tables
*/
template<class Traits>
struct tr_infrastructure {
typedef typename Traits::base_object base_object;
typedef typename Traits::signature signature;
typedef typename Traits::element element;
typedef typename Traits::fact fact;
typedef typename Traits::kind kind;
class base_fn {
public:
virtual ~base_fn() {}
};
class join_fn : public base_fn {
public:
virtual base_object * operator()(const base_object & t1, const base_object & t2);
};
class transformer_fn : public base_fn {
public:
virtual base_object * operator()(const base_object & t);
};
class union_fn : public base_fn {
public:
virtual void operator()(base_object & tgt, const base_object & src, base_object * delta);
};
class mutator_fn : public base_fn {
public:
virtual void operator()(base_object & t);
};
class negation_filter_fn : public base_fn {
public:
virtual void operator()(base_object & t, const base_object & negated_obj);
};
class plugin_object {
const kind m_kind;
protected:
plugin_object(kind k) : m_kind(k) {}
public:
kind get_kind();
virtual base_object * mk_empty(const signature & s) = 0;
virtual join_fn * mk_join_fn(const table_base & t1, const table_base & t2,
unsigned col_cnt, const unsigned * cols1, const unsigned * cols2) {
NOT_IMPLEMENTED_YET();
}
virtual transformer_fn * mk_project_fn(const base_object & t, unsigned col_cnt,
const unsigned * removed_cols) = 0
virtual transformer_fn * mk_rename_fn(const base_object & t, unsigned permutation_cycle_len,
const unsigned * permutation_cycle) = 0;
virtual union_fn * mk_union_fn(base_object & tgt, const base_object & src, base_object * delta) = 0;
virtual mutator_fn * mk_filter_identical_fn(base_object & t, unsigned col_cnt,
const unsigned * identical_cols) = 0;
virtual mutator_fn * mk_filter_equal_fn(base_object & t, const element & value,
unsigned col) = 0;
virtual mutator_fn * mk_filter_interpreted_fn(base_object & t, app * condition) = 0;
virtual negation_filter_fn * mk_filter_interpreted_fn(base_object & t,
const base_object & negated_obj, unsigned joined_col_cnt,
const unsigned * t_cols, const unsigned * negated_cols) = 0;
};
class base_ancestor {
const kind m_kind;
protected:
relation_manager & m_manager;
signature m_signature;
base_ancestor(kind k, relation_manager & m, const signature & s)
: m_kind(k), m_manager(m), m_signature(s) {}
public:
virtual ~base_ancestor() {}
kind get_kind() const { return m_kind; }
relation_manager & get_manager() const { return m_manager; }
const signature & get_signature() const { return m_signature; }
virtual bool empty() const = 0;
virtual void add_fact(const fact & f) = 0;
virtual bool contains_fact(const fact & f) const = 0;
/**
\brief Return table that contains the same data as the current one.
*/
virtual base_object * clone() const;
};
};
// -----------------------------------
//
// relation_base
//
// -----------------------------------
class relation_base1;
enum relation_kind {
RK_UNKNOWN,
RK_TABLE
};
struct relation_traits {
typedef relation_base1 base_object;
typedef relation_signature signature;
typedef app * element;
typedef ptr_vector<app> fact;
typedef relation_kind kind;
};
typedef tr_infrastructure<relation_traits> relation_infrastructure;
typedef relation_infrastructure::plugin_object relation_plugin_base;
class relation_base1 : public relation_infrastructure::base_ancestor {
};
// -----------------------------------
//
// table_base
//
// -----------------------------------
class table_base1;
struct table_traits {
typedef table_base1 base_object;
typedef table_signature signature;
typedef unsigned element;
typedef unsigned_vector fact;
typedef table_kind kind;
};
typedef tr_infrastructure<table_traits> table_infrastructure;
typedef table_infrastructure::plugin_object table_plugin_base;
class table_base1 : public table_infrastructure::base_ancestor {
};
};
#endif /* _DL_TABLE_PLUGIN_H_ */