z3-z3-4.13.0.src.muz.rel.dl_table.h Maven / Gradle / Ivy
The newest version!
/*++
Copyright (c) 2006 Microsoft Corporation
Module Name:
dl_table.h
Abstract:
Author:
Krystof Hoder (t-khoder) 2010-09-01.
Revision History:
--*/
#pragma once
#include
#include
#include "ast/ast.h"
#include "util/bit_vector.h"
#include "util/buffer.h"
#include "util/hashtable.h"
#include "util/map.h"
#include "util/ref_vector.h"
#include "util/vector.h"
#include "util/union_find.h"
#include "muz/rel/dl_base.h"
#include "muz/base/dl_util.h"
#include "util/bit_vector.h"
namespace datalog {
class context;
class variable_intersection;
// -----------------------------------
//
// hashtable_table
//
// -----------------------------------
class hashtable_table;
class hashtable_table_plugin : public table_plugin {
friend class hashtable_table;
protected:
class join_fn;
public:
typedef hashtable_table table;
hashtable_table_plugin(relation_manager & manager)
: table_plugin(symbol("hashtable"), manager) {}
table_base * mk_empty(const table_signature & s) override;
table_join_fn * mk_join_fn(const table_base & t1, const table_base & t2,
unsigned col_cnt, const unsigned * cols1, const unsigned * cols2) override;
};
class hashtable_table : public table_base {
friend class hashtable_table_plugin;
friend class hashtable_table_plugin::join_fn;
class our_iterator_core;
typedef hashtable,
vector_eq_proc > storage;
storage m_data;
hashtable_table(hashtable_table_plugin & plugin, const table_signature & sig)
: table_base(plugin, sig) {}
public:
hashtable_table_plugin & get_plugin() const
{ return static_cast(table_base::get_plugin()); }
void add_fact(const table_fact & f) override {
m_data.insert(f);
}
void remove_fact(const table_element* fact) override {
table_fact f(get_signature().size(), fact);
m_data.remove(f);
}
bool contains_fact(const table_fact & f) const override {
return m_data.contains(f);
}
iterator begin() const override;
iterator end() const override;
unsigned get_size_estimate_rows() const override { return m_data.size(); }
unsigned get_size_estimate_bytes() const override { return m_data.size()*get_signature().size()*8; }
bool knows_exact_size() const override { return true; }
};
// -----------------------------------
//
// bitvector_table
//
// -----------------------------------
class bitvector_table;
class bitvector_table_plugin : public table_plugin {
public:
typedef bitvector_table table;
bitvector_table_plugin(relation_manager & manager)
: table_plugin(symbol("bitvector"), manager) {}
bool can_handle_signature(const table_signature & s) override;
table_base * mk_empty(const table_signature & s) override;
};
class bitvector_table : public table_base {
friend class bitvector_table_plugin;
class bv_iterator;
bit_vector m_bv;
unsigned m_num_cols;
unsigned_vector m_shift;
unsigned_vector m_mask;
unsigned fact2offset(const table_element* f) const;
void offset2fact(unsigned offset, table_fact& f) const;
bitvector_table(bitvector_table_plugin & plugin, const table_signature & sig);
public:
void add_fact(const table_fact & f) override;
void remove_fact(const table_element* fact) override;
bool contains_fact(const table_fact & f) const override;
iterator begin() const override;
iterator end() const override;
};
};