+ BlockTypeRegistry();
+
+ /// register a new block type
+ /// this may throw if the name is already taken (names must be unique)
+ Block::Type Add(BlockType &&);
+
+ size_t size() const noexcept { return types.size(); }
+
+ iterator begin() noexcept { return types.begin(); }
+ const_iterator begin() const noexcept { return types.begin(); }
+ iterator end() noexcept { return types.end(); }
+ const_iterator end() const noexcept { return types.end(); }
+
+ /// lookup by ID
+ BlockType &operator [](Block::Type id) noexcept { return types[id]; }
+ const BlockType &operator [](Block::Type id) const noexcept { return types[id]; }