79 lines
1.7 KiB
C++
79 lines
1.7 KiB
C++
#ifndef ERA_ARRAY_H
|
|
#define ERA_ARRAY_H
|
|
|
|
#include "persistent-data/data-structures/array.h"
|
|
#include "persistent-data/data-structures/simple_traits.h"
|
|
|
|
//----------------------------------------------------------------
|
|
|
|
namespace era {
|
|
namespace era_array_detail {
|
|
class damage_visitor;
|
|
|
|
class damage {
|
|
public:
|
|
damage(std::string const &desc)
|
|
: desc_(desc) {
|
|
}
|
|
|
|
virtual ~damage() {}
|
|
virtual void visit(damage_visitor &v) const = 0;
|
|
|
|
std::string get_desc() const {
|
|
return desc_;
|
|
}
|
|
|
|
private:
|
|
std::string desc_;
|
|
};
|
|
|
|
struct missing_eras : public damage {
|
|
missing_eras(std::string const &desc, run<uint32_t> const &eras);
|
|
virtual void visit(damage_visitor &v) const;
|
|
|
|
run<uint32_t> eras_;
|
|
};
|
|
|
|
struct invalid_era : public damage {
|
|
invalid_era(std::string const &desc, block_address block, uint32_t era);
|
|
virtual void visit(damage_visitor &v) const;
|
|
|
|
block_address block_;
|
|
uint32_t era_;
|
|
};
|
|
|
|
class damage_visitor {
|
|
public:
|
|
virtual ~damage_visitor() {}
|
|
|
|
void visit(era_array_detail::damage const &d) {
|
|
d.visit(*this);
|
|
}
|
|
|
|
virtual void visit(missing_eras const &d) = 0;
|
|
virtual void visit(invalid_era const &d) = 0;
|
|
};
|
|
}
|
|
|
|
typedef persistent_data::array<uint32_traits> era_array;
|
|
|
|
class era_array_visitor {
|
|
public:
|
|
virtual ~era_array_visitor() {}
|
|
|
|
virtual void visit(uint32_t index, uint32_t era) = 0;
|
|
};
|
|
|
|
void walk_era_array(era_array const &array,
|
|
era_array_visitor &ev,
|
|
era_array_detail::damage_visitor &dv);
|
|
|
|
void check_era_array(era_array const &array,
|
|
uint32_t current_era,
|
|
era_array_detail::damage_visitor &dv);
|
|
}
|
|
|
|
//----------------------------------------------------------------
|
|
|
|
#endif
|