#include "basesolver.hpp"
#include "clause.hpp"
#include <boost/thread/thread.hpp>
#include <boost/lockfree/spsc_queue.hpp>

struct kissat;
struct cvec;

class basekissat : public basesolver {
public:
    void parse_dimacs(char* filename);
    void import_original_clause(preprocess *pre);
    void diversity(int id);
    void terminate();
    int  solve();
    void get_model(vec<int> &model);
    int  get_reset_data();
    void reset();
    void export_clauses_to(vec<clause_store *> &clauses);
    void import_clauses_from(vec<clause_store *> &clauses);
    void broaden_export_limit();
    void restrict_export_limit();

    basekissat(int id, light *light);
    ~basekissat();
    int x1 = 0, x2 = 0;
    kissat* solver;
    int good_clause_lbd = 0;
    
    boost::lockfree::spsc_queue<clause_store*, boost::lockfree::capacity<1024000>> import_clause;
    boost::lockfree::spsc_queue<clause_store*, boost::lockfree::capacity<1024000>> export_clause;
    friend int cbkImportClause(void *, int *, cvec *);
    friend int cbkExportClause(void *, int *, cvec *);
    friend void cbkWaitSharing(void *);
    std::ofstream outimport;
    std::ofstream outexport;
    std::ofstream outfree;
};