update ContentUnitIndices

This commit is contained in:
MihailRis 2025-12-15 22:05:27 +03:00
parent 55e4e6de02
commit c3c343ffdb
9 changed files with 38 additions and 26 deletions

View file

@ -15,9 +15,9 @@
#include "ContentPack.hpp" #include "ContentPack.hpp"
ContentIndices::ContentIndices( ContentIndices::ContentIndices(
ContentUnitIndices<Block> blocks, ContentUnitIndices<Block, blockid_t> blocks,
ContentUnitIndices<ItemDef> items, ContentUnitIndices<ItemDef, itemid_t> items,
ContentUnitIndices<EntityDef> entities ContentUnitIndices<EntityDef, entitydefid_t> entities
) )
: blocks(std::move(blocks)), : blocks(std::move(blocks)),
items(std::move(items)), items(std::move(items)),

View file

@ -36,48 +36,57 @@ public:
} }
}; };
template <class T> template <class T, typename IdType>
class ContentUnitIndices { class ContentUnitIndices {
std::vector<T*> defs; std::vector<T*> defs;
public: public:
ContentUnitIndices(std::vector<T*> defs) : defs(std::move(defs)) { ContentUnitIndices(std::vector<T*> defs) : defs(std::move(defs)) {
} }
inline const T* get(blockid_t id) const { const T* get(IdType id) const {
if (id >= defs.size()) { if (id >= defs.size()) {
return nullptr; return nullptr;
} }
return defs[id]; return defs[id];
} }
inline const T& require(blockid_t id) const { const T& require(IdType id) const {
return *defs.at(id); if (id >= defs.size()) {
invalidId(id);
}
return *defs[id];
} }
inline size_t count() const { size_t count() const {
return defs.size(); return defs.size();
} }
inline const auto& getIterable() const { const auto& getIterable() const {
return defs; return defs;
} }
inline const T* const* getDefs() const { const T* const* getDefs() const {
return defs.data(); return defs.data();
} }
private:
void invalidId(IdType id) const {
throw std::runtime_error(
"invalid content unit id: " + std::to_string(id)
);
}
}; };
/// @brief Runtime defs cache: indices /// @brief Runtime defs cache: indices
class ContentIndices { class ContentIndices {
public: public:
ContentUnitIndices<Block> blocks; ContentUnitIndices<Block, blockid_t> blocks;
ContentUnitIndices<ItemDef> items; ContentUnitIndices<ItemDef, itemid_t> items;
ContentUnitIndices<EntityDef> entities; ContentUnitIndices<EntityDef, entitydefid_t> entities;
ContentIndices( ContentIndices(
ContentUnitIndices<Block> blocks, ContentUnitIndices<Block, blockid_t> blocks,
ContentUnitIndices<ItemDef> items, ContentUnitIndices<ItemDef, itemid_t> items,
ContentUnitIndices<EntityDef> entities ContentUnitIndices<EntityDef, entitydefid_t> entities
); );
}; };

View file

@ -22,9 +22,9 @@ ContentReport::ContentReport(
regionsVersion(regionsVersion) { regionsVersion(regionsVersion) {
} }
template <class T> template <class T, typename IdType>
static constexpr size_t get_entries_count( static constexpr size_t get_entries_count(
const ContentUnitIndices<T>& indices, const dv::value& list const ContentUnitIndices<T, IdType>& indices, const dv::value& list
) { ) {
return list != nullptr ? std::max(list.size(), indices.count()) return list != nullptr ? std::max(list.size(), indices.count())
: indices.count(); : indices.count();

View file

@ -51,7 +51,7 @@ class ContentUnitLUT {
public: public:
ContentUnitLUT( ContentUnitLUT(
size_t count, size_t count,
const ContentUnitIndices<U>& unitIndices, const ContentUnitIndices<U, T>& unitIndices,
T missingValue, T missingValue,
ContentType type ContentType type
) )

View file

@ -253,9 +253,9 @@ void scripting::process_post_runnables() {
} }
} }
template <class T> template <class T, typename IdType>
static int push_properties_tables( static int push_properties_tables(
lua::State* L, const ContentUnitIndices<T>& indices lua::State* L, const ContentUnitIndices<T, IdType>& indices
) { ) {
const auto units = indices.getDefs(); const auto units = indices.getDefs();
size_t size = indices.count(); size_t size = indices.count();

View file

@ -21,6 +21,7 @@ using ubyte = uint8_t;
// content indices // content indices
using itemid_t = uint32_t; using itemid_t = uint32_t;
using blockid_t = uint16_t; using blockid_t = uint16_t;
using entitydefid_t = uint16_t;
using entityid_t = uint64_t; using entityid_t = uint64_t;
using itemcount_t = uint32_t; using itemcount_t = uint32_t;

View file

@ -70,7 +70,7 @@ void GlobalChunks::erase(int x, int z) {
static inline auto load_inventories( static inline auto load_inventories(
WorldRegions& regions, WorldRegions& regions,
const Chunk& chunk, const Chunk& chunk,
const ContentUnitIndices<Block>& defs const ContentUnitIndices<Block, blockid_t>& defs
) { ) {
auto invs = regions.fetchInventories(chunk.x, chunk.z); auto invs = regions.fetchInventories(chunk.x, chunk.z);
auto iterator = invs.begin(); auto iterator = invs.begin();

View file

@ -11,11 +11,13 @@
#include <unordered_set> #include <unordered_set>
#include <vector> #include <vector>
#include "typedefs.hpp"
class Block; class Block;
class Level; class Level;
class GlobalChunks; class GlobalChunks;
template <typename T> template <typename T, typename IdType>
class ContentUnitIndices; class ContentUnitIndices;
namespace voxels { namespace voxels {
@ -82,7 +84,7 @@ namespace voxels {
private: private:
const Level& level; const Level& level;
const GlobalChunks& chunks; const GlobalChunks& chunks;
const ContentUnitIndices<Block>& blockDefs; const ContentUnitIndices<Block, blockid_t>& blockDefs;
std::unordered_map<int, Agent> agents; std::unordered_map<int, Agent> agents;
int nextAgent = 1; int nextAgent = 1;

View file

@ -104,9 +104,9 @@ void WorldFiles::writePacks(const std::vector<ContentPack>& packs) {
io::write_string(packsFile, ss.str()); io::write_string(packsFile, ss.str());
} }
template <class T> template <class T, typename IdType>
static void write_indices( static void write_indices(
const ContentUnitIndices<T>& indices, dv::value& list const ContentUnitIndices<T, IdType>& indices, dv::value& list
) { ) {
for (auto unit : indices.getIterable()) { for (auto unit : indices.getIterable()) {
list.add(unit->name); list.add(unit->name);