73 lines
1.7 KiB
C++
73 lines
1.7 KiB
C++
#pragma once
|
|
|
|
#include <boost/serialization/vector.hpp>
|
|
#include <boost/serialization/utility.hpp>
|
|
#include <boost/serialization/serialization.hpp>
|
|
#include <vector>
|
|
#include <utility>
|
|
#include <string>
|
|
|
|
struct BasicRulesBase {
|
|
unsigned int min_size;
|
|
|
|
private:
|
|
friend class boost::serialization::access;
|
|
template<class Archive>
|
|
void serialize(Archive & ar, const unsigned int /*version*/){
|
|
ar & min_size;
|
|
}
|
|
};
|
|
|
|
template <typename Grid>
|
|
struct Solutions {
|
|
using Trace = std::vector<typename Grid::Position>;
|
|
std::vector<Trace> traces;
|
|
|
|
private:
|
|
friend class boost::serialization::access;
|
|
template<class Archive>
|
|
void serialize(Archive & ar, const unsigned int /*version*/){
|
|
ar & traces;
|
|
}
|
|
};
|
|
|
|
template <typename Grid>
|
|
struct AnalyzedGrid {
|
|
Grid grid;
|
|
Solutions<Grid> solutions;
|
|
BasicRulesBase rules;
|
|
|
|
private:
|
|
friend class boost::serialization::access;
|
|
template<class Archive>
|
|
void serialize(Archive & ar, const unsigned int /*version*/){
|
|
ar & grid & solutions & rules;
|
|
}
|
|
};
|
|
|
|
struct DynamicGridBase {
|
|
using Position = std::pair<int, int>;
|
|
|
|
int W;
|
|
int H;
|
|
std::vector<int> grid;
|
|
std::vector<Position> positions;
|
|
|
|
DynamicGridBase() = default;
|
|
DynamicGridBase(int width, int height, std::vector<int> && data)
|
|
: W(width), H(height), grid(std::move(data))
|
|
{}
|
|
|
|
private:
|
|
friend class boost::serialization::access;
|
|
template<class Archive>
|
|
void serialize(Archive & ar, const unsigned int /*version*/){
|
|
ar & W & H & grid & positions;
|
|
// archiving positions is redundant (I'm being lazy here)
|
|
// consider make_nvp for readable json
|
|
}
|
|
};
|
|
|
|
struct DynamicGrid;
|
|
AnalyzedGrid<DynamicGrid> grid_from_file(std::string file_path);
|
|
void grid_to_file(AnalyzedGrid<DynamicGrid> const & grid, std::string file_path);
|