From 4539791823a2fb1506e9091ec5087c80a87adfde Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Tue, 21 Jul 2026 17:27:05 +0200 Subject: kapi/device: remove major and minor --- kernel/kapi/devices.cpp | 16 ++++------------ kernel/kapi/devices/bus.cpp | 14 ++++++++------ kernel/kapi/devices/cpu.cpp | 11 ++++++----- kernel/kapi/devices/device.cpp | 18 ++---------------- kernel/kapi/devices/interface_registry.tests.cpp | 2 +- kernel/kernel/devices/block_device_utils.tests.cpp | 4 ++-- kernel/kernel/devices/root_bus.cpp | 2 +- kernel/kernel/devices/storage/controller.cpp | 12 ------------ kernel/kernel/devices/storage/controller.hpp | 8 -------- kernel/kernel/devices/storage/ram_disk/controller.cpp | 3 +-- kernel/kernel/devices/storage/ram_disk/device.cpp | 4 ++-- kernel/kernel/devices/storage/ram_disk/device.hpp | 4 +--- .../kernel/devices/storage/ram_disk/device.tests.cpp | 6 +++--- kernel/kernel/filesystem/device_inode.tests.cpp | 6 +++--- .../kernel/filesystem/device_number_registry.tests.cpp | 6 +++--- kernel/kernel/filesystem/ext2/filesystem.tests.cpp | 6 +++--- kernel/kernel/filesystem/ext2/inode.tests.cpp | 14 +++++++------- kernel/kernel/test_support/devices/block_device.cpp | 5 ++--- kernel/kernel/test_support/devices/block_device.hpp | 3 +-- .../kernel/test_support/devices/character_device.cpp | 6 ++---- .../kernel/test_support/devices/character_device.hpp | 4 +--- 21 files changed, 53 insertions(+), 101 deletions(-) (limited to 'kernel') diff --git a/kernel/kapi/devices.cpp b/kernel/kapi/devices.cpp index ef72c667..ae2d4d7a 100644 --- a/kernel/kapi/devices.cpp +++ b/kernel/kapi/devices.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -21,7 +22,7 @@ namespace kapi::devices { auto constinit next_major_number = std::atomic_size_t{1}; auto constinit root_bus = std::optional{}; - auto constinit device_tree = kstd::flat_map, kstd::observer_ptr>{}; + auto constinit device_tree = kstd::flat_map>{}; } // namespace auto init() -> void @@ -54,8 +55,8 @@ namespace kapi::devices auto register_device(device & device) -> bool { - kstd::println("[OS:DEV] Registering device {}@{}:{}", device.name(), device.major(), device.minor()); - return device_tree.emplace(std::pair{device.major(), device.minor()}, &device).second; + kstd::println("[OS:DEV] Registering device {}", device.name()); + return device_tree.emplace(device.name(), &device).second; } auto unregister_device(device &) -> bool @@ -64,15 +65,6 @@ namespace kapi::devices return false; } - auto find_device(std::size_t major, std::size_t minor) -> kstd::observer_ptr - { - if (device_tree.contains(std::pair{major, minor})) - { - return device_tree.at(std::pair{major, minor}); - } - return nullptr; - } - auto find_device(std::string_view name) -> kstd::observer_ptr { for (auto const & [key, value] : device_tree) diff --git a/kernel/kapi/devices/bus.cpp b/kernel/kapi/devices/bus.cpp index 4695ae39..d9f3f991 100644 --- a/kernel/kapi/devices/bus.cpp +++ b/kernel/kapi/devices/bus.cpp @@ -9,26 +9,25 @@ #include #include -#include #include namespace kapi::devices { - bus::bus(std::size_t major, std::size_t minor, kstd::string const & name) - : device(major, minor, name) + bus::bus(kstd::string const & name) + : device{name} {} auto bus::init() -> bool { if (m_init_was_called.test_and_set()) { - kstd::println(kstd::print_sink::stderr, "[OS:DEV] Bus {}:{}:{} already initialized", name(), major(), minor()); + kstd::println(kstd::print_sink::stderr, "[OS:DEV] Bus {} already initialized", name()); return true; } if (!enumerate()) { - kstd::println(kstd::print_sink::stderr, "[OS:DEV] Bus {}:{}:{} enumeration failed", name(), major(), minor()); + kstd::println(kstd::print_sink::stderr, "[OS:DEV] Bus {} enumeration failed", name()); return false; } @@ -47,7 +46,10 @@ namespace kapi::devices auto observer = m_observers.emplace_back(child.get()); child->set_parent(kstd::make_observer(this)); m_devices.push_back(std::move(child)); - kapi::devices::register_device(*observer); + if (!kapi::devices::register_device(*observer)) + { + kapi::system::panic("[OS:DEV] Failed to register child device"); + } if (m_initialized.test()) { diff --git a/kernel/kapi/devices/cpu.cpp b/kernel/kapi/devices/cpu.cpp index 457b9d56..daba34a8 100644 --- a/kernel/kapi/devices/cpu.cpp +++ b/kernel/kapi/devices/cpu.cpp @@ -2,14 +2,15 @@ #include -#include +#include + #include namespace kapi::devices { - cpu::core::core(std::size_t major, std::size_t minor, std::uint64_t index, std::uint64_t hardware_id, bool is_bsp) - : kapi::devices::bus{major, minor, "cpu_core"} + cpu::core::core(std::uint64_t index, std::uint64_t hardware_id, bool is_bsp) + : kapi::devices::bus{kstd::format("cpu_core{}", index)} , m_index{index} , m_hardware_id{hardware_id} , m_is_bsp{is_bsp} @@ -30,8 +31,8 @@ namespace kapi::devices return m_is_bsp; } - cpu::cpu(std::size_t major, std::size_t minor) - : kapi::devices::bus{major, minor, "cpu"} + cpu::cpu() + : kapi::devices::bus{"cpu"} {} } // namespace kapi::devices \ No newline at end of file diff --git a/kernel/kapi/devices/device.cpp b/kernel/kapi/devices/device.cpp index 6ac92e79..0d00d8fd 100644 --- a/kernel/kapi/devices/device.cpp +++ b/kernel/kapi/devices/device.cpp @@ -6,26 +6,12 @@ #include #include -#include - namespace kapi::devices { - device::device(size_t major, size_t minor, kstd::string const & name) - : m_major(major) - , m_minor(minor) - , m_name(name) + device::device(kstd::string const & name) + : m_name(name) {} - [[nodiscard]] auto device::major() const -> size_t - { - return m_major; - } - - [[nodiscard]] auto device::minor() const -> size_t - { - return m_minor; - } - [[nodiscard]] auto device::name() const -> kstd::string const & { return m_name; diff --git a/kernel/kapi/devices/interface_registry.tests.cpp b/kernel/kapi/devices/interface_registry.tests.cpp index ffd9f0d6..aea7776c 100644 --- a/kernel/kapi/devices/interface_registry.tests.cpp +++ b/kernel/kapi/devices/interface_registry.tests.cpp @@ -30,7 +30,7 @@ namespace struct test_device final : kapi::devices::device, probe_device { explicit test_device(int value, const_device & const_device) - : device{0, 0, "probeable"} + : device{"probeable"} , m_value{value} , m_const_device{&const_device} {} diff --git a/kernel/kernel/devices/block_device_utils.tests.cpp b/kernel/kernel/devices/block_device_utils.tests.cpp index fd68a63b..7d671c7e 100644 --- a/kernel/kernel/devices/block_device_utils.tests.cpp +++ b/kernel/kernel/devices/block_device_utils.tests.cpp @@ -21,7 +21,7 @@ SCENARIO("reading from a block device with block_device_utils", "[devices][block GIVEN("a block device with known data") { auto const block_size = 512_B; - auto device = kstd::make_shared(0, 0, "test_block_device", block_size); + auto device = kstd::make_shared("test_block_device", block_size); kstd::vector block_data(block_size.value); for (size_t i = 0; i < block_data.size(); ++i) { @@ -108,7 +108,7 @@ SCENARIO("writing to a block device using block_device_utils", "[devices][block_ { auto const block_size = 512_B; auto device = - kstd::make_shared(0, 0, "test_block_device", block_size, 2 * block_size); + kstd::make_shared("test_block_device", block_size, 2 * block_size); WHEN("writing to the block device using block_device_utils") { diff --git a/kernel/kernel/devices/root_bus.cpp b/kernel/kernel/devices/root_bus.cpp index 1b754f23..9a0b0776 100644 --- a/kernel/kernel/devices/root_bus.cpp +++ b/kernel/kernel/devices/root_bus.cpp @@ -6,7 +6,7 @@ namespace kernel::devices { root_bus::root_bus() - : kapi::devices::bus{0, 0, "system"} + : kapi::devices::bus{"system"} {} } // namespace kernel::devices \ No newline at end of file diff --git a/kernel/kernel/devices/storage/controller.cpp b/kernel/kernel/devices/storage/controller.cpp index 5ea9eb71..f2b67938 100644 --- a/kernel/kernel/devices/storage/controller.cpp +++ b/kernel/kernel/devices/storage/controller.cpp @@ -5,7 +5,6 @@ #include #include -#include #include namespace kernel::devices::storage @@ -21,17 +20,6 @@ namespace kernel::devices::storage return m_major; } - auto controller::device_by_minor(size_t minor) const -> kstd::shared_ptr - { - auto it = std::ranges::find_if(m_devices, [minor](auto const & device) { return device->minor() == minor; }); - - if (it != m_devices.end()) - { - return *it; - } - return nullptr; - } - auto controller::devices_count() const -> size_t { return m_devices.size(); diff --git a/kernel/kernel/devices/storage/controller.hpp b/kernel/kernel/devices/storage/controller.hpp index 13494a52..770c1997 100644 --- a/kernel/kernel/devices/storage/controller.hpp +++ b/kernel/kernel/devices/storage/controller.hpp @@ -53,14 +53,6 @@ namespace kernel::devices::storage */ [[nodiscard]] auto all_devices() const -> kstd::vector> const &; - /** - * @brief Find a managed device by major/minor numbers. - * @param major Device major number. - * @param minor Device minor number. - * @return Matching block device, or nullptr if no device matches. - */ - [[nodiscard]] auto device_by_minor(size_t minor) const -> kstd::shared_ptr; - protected: size_t m_major{}; size_t m_minors_per_device{}; diff --git a/kernel/kernel/devices/storage/ram_disk/controller.cpp b/kernel/kernel/devices/storage/ram_disk/controller.cpp index 905279a4..afae9ef2 100644 --- a/kernel/kernel/devices/storage/ram_disk/controller.cpp +++ b/kernel/kernel/devices/storage/ram_disk/controller.cpp @@ -22,8 +22,7 @@ namespace kernel::devices::storage::ram_disk size_t current_device_index = 0; std::ranges::for_each(*m_boot_module_registry, [this, ¤t_device_index](auto const & module) { - auto const minor = current_device_index++; - auto const disk = kstd::make_shared(module, m_major, minor, minor); + auto const disk = kstd::make_shared(module, current_device_index++); disk->init(); if (auto published = kapi::devices::publish_interface(disk, disk->name()); diff --git a/kernel/kernel/devices/storage/ram_disk/device.cpp b/kernel/kernel/devices/storage/ram_disk/device.cpp index f9fa60bb..a9de0a2e 100644 --- a/kernel/kernel/devices/storage/ram_disk/device.cpp +++ b/kernel/kernel/devices/storage/ram_disk/device.cpp @@ -22,8 +22,8 @@ namespace kernel::devices::storage::ram_disk constexpr auto ram_disk_block_size = 512_B; } // namespace - device::device(kapi::boot_modules::boot_module const & module, size_t major, size_t minor, std::size_t device_index) - : kapi::devices::device(major, minor, kstd::format("ram{}", device_index)) + device::device(kapi::boot_modules::boot_module const & module, std::size_t device_index) + : kapi::devices::device{kstd::format("ram{}", device_index)} , m_boot_module(module) {} diff --git a/kernel/kernel/devices/storage/ram_disk/device.hpp b/kernel/kernel/devices/storage/ram_disk/device.hpp index 0bb09875..e4f99633 100644 --- a/kernel/kernel/devices/storage/ram_disk/device.hpp +++ b/kernel/kernel/devices/storage/ram_disk/device.hpp @@ -19,10 +19,8 @@ namespace kernel::devices::storage::ram_disk /** * @brief Create a RAM disk for the @p module. * @param module Boot module providing the memory region. - * @param major Device major number. - * @param minor Device minor number. */ - device(kapi::boot_modules::boot_module const & module, size_t major, size_t minor, std::size_t device_index); + device(kapi::boot_modules::boot_module const & module, std::size_t device_index); /** * @brief Initialize the RAM disk device. diff --git a/kernel/kernel/devices/storage/ram_disk/device.tests.cpp b/kernel/kernel/devices/storage/ram_disk/device.tests.cpp index a10dc84e..115afd86 100644 --- a/kernel/kernel/devices/storage/ram_disk/device.tests.cpp +++ b/kernel/kernel/devices/storage/ram_disk/device.tests.cpp @@ -22,7 +22,7 @@ SCENARIO("RAM Disk Device Construction and Initialization", "[ram_disk_device]") WHEN("constructing the device") { - kernel::devices::storage::ram_disk::device device{boot_module, 0, 0, 0}; + kernel::devices::storage::ram_disk::device device{boot_module, 0}; THEN("init return false") { @@ -39,7 +39,7 @@ SCENARIO("RAM Disk Device Construction and Initialization", "[ram_disk_device]") WHEN("constructing the device") { - kernel::devices::storage::ram_disk::device device{boot_module, 0, 0, 0}; + kernel::devices::storage::ram_disk::device device{boot_module, 0}; THEN("init return true") { @@ -56,7 +56,7 @@ SCENARIO("RAM Disk Device Read and Write", "[ram_disk_device]") auto storage = std::vector{4096, std::byte{0xff}}; auto module = kapi::boot_modules::boot_module{"test_module", kapi::memory::linear_address{storage.data()}, storage.size()}; - auto device = kernel::devices::storage::ram_disk::device{module, 0, 0, 0}; + auto device = kernel::devices::storage::ram_disk::device{module, 0}; REQUIRE(device.init()); WHEN("reading a full block from the device") diff --git a/kernel/kernel/filesystem/device_inode.tests.cpp b/kernel/kernel/filesystem/device_inode.tests.cpp index b0d0659f..e821ce1d 100644 --- a/kernel/kernel/filesystem/device_inode.tests.cpp +++ b/kernel/kernel/filesystem/device_inode.tests.cpp @@ -21,7 +21,7 @@ SCENARIO("Device inode construction", "[filesystem][device_inode]") { GIVEN("a block device") { - auto device = kstd::make_shared(0, 0, "test_block_device", 512_B, 3 * 512_B); + auto device = kstd::make_shared("test_block_device", 512_B, 3 * 512_B); WHEN("constructing a device inode with the block device") { @@ -55,7 +55,7 @@ SCENARIO("Device inode read/write", "[filesystem][device_inode]") { GIVEN("a block device and a device inode for that device") { - auto device = kstd::make_shared(0, 0, "test_block_device", 512_B, 3 * 512_B); + auto device = kstd::make_shared("test_block_device", 512_B, 3 * 512_B); auto inode = kernel::filesystem::device_inode{device}; WHEN("writing to the device inode") @@ -89,7 +89,7 @@ SCENARIO("Device inode read/write with a non-block device", "[filesystem][device { GIVEN("a non-block device and a device inode for that device") { - auto device = kstd::make_shared(0, 0, "test_character_device"); + auto device = kstd::make_shared("test_character_device"); auto inode = kernel::filesystem::device_inode{device}; WHEN("reading from the device inode") diff --git a/kernel/kernel/filesystem/device_number_registry.tests.cpp b/kernel/kernel/filesystem/device_number_registry.tests.cpp index 7090860e..67e09831 100644 --- a/kernel/kernel/filesystem/device_number_registry.tests.cpp +++ b/kernel/kernel/filesystem/device_number_registry.tests.cpp @@ -28,7 +28,7 @@ SCENARIO("Device number registry resolves and numbers published block devices", GIVEN("A single block device has been published") { - auto device = kstd::make_shared(0, 0, "ram0", 512_B); + auto device = kstd::make_shared("ram0", 512_B); CHECK(interfaces.publish(device, "ram0")); THEN("all() returns a vector with one element") @@ -65,7 +65,7 @@ SCENARIO("Device number registry resolves and numbers published block devices", THEN("number_of() fails on a device that has never been published") { - auto not_published = kstd::make_shared(0, 0, "ram1", 512_B); + auto not_published = kstd::make_shared("ram1", 512_B); REQUIRE(!registry.number_of(*not_published)); } @@ -73,7 +73,7 @@ SCENARIO("Device number registry resolves and numbers published block devices", GIVEN("A device was published") { - auto device = kstd::make_shared(0, 0, "ram0", 512_B); + auto device = kstd::make_shared("ram0", 512_B); CHECK(interfaces.publish(device, "ram0")); auto number = registry.number_of(*device); diff --git a/kernel/kernel/filesystem/ext2/filesystem.tests.cpp b/kernel/kernel/filesystem/ext2/filesystem.tests.cpp index 9013ea22..bf408d55 100644 --- a/kernel/kernel/filesystem/ext2/filesystem.tests.cpp +++ b/kernel/kernel/filesystem/ext2/filesystem.tests.cpp @@ -174,7 +174,7 @@ SCENARIO("Ext2 filesystem rejects invalid magic", "[filesystem][ext2][filesystem auto const block_size = 1024_B; GIVEN("a block device that does not contain an ext2 superblock") { - auto device = kstd::make_shared(0, 0, "mock", block_size, 2 * block_size); + auto device = kstd::make_shared("mock", block_size, 2 * block_size); REQUIRE(device); auto dev_inode = kstd::make_shared(device); @@ -194,7 +194,7 @@ SCENARIO("Ext2 block mapping includes direct and all indirect levels", "[filesys GIVEN("a minimally valid ext2 layout with configured indirect block tables") { - auto device = kstd::make_shared(0, 0, "mock", block_size, 128 * block_size); + auto device = kstd::make_shared("mock", block_size, 128 * block_size); REQUIRE(device); kernel::tests::filesystem::ext2::setup_mock_ext2_layout(*device); @@ -246,7 +246,7 @@ SCENARIO("Ext2 block writing includes direct and all indirect levels", "[filesys GIVEN("a mounted ext2 filesystem with free blocks available for indirect table allocation") { - auto device = kstd::make_shared(0, 0, "mock", block_size, 256 * block_size); + auto device = kstd::make_shared("mock", block_size, 256 * block_size); REQUIRE(device); auto superblock = kernel::filesystem::ext2::superblock{}; diff --git a/kernel/kernel/filesystem/ext2/inode.tests.cpp b/kernel/kernel/filesystem/ext2/inode.tests.cpp index e3c06407..e587d75e 100644 --- a/kernel/kernel/filesystem/ext2/inode.tests.cpp +++ b/kernel/kernel/filesystem/ext2/inode.tests.cpp @@ -140,7 +140,7 @@ SCENARIO("Ext2 inode handles zeros in block mappings as file holes", "[filesyste auto const block_size = 1024_B; GIVEN("an ext2 inode with only direct mapped data blocks") { - auto device = kstd::make_shared(0, 0, "mock", block_size, 64 * block_size); + auto device = kstd::make_shared("mock", block_size, 64 * block_size); REQUIRE(device != nullptr); kernel::tests::filesystem::ext2::setup_mock_ext2_layout(*device); @@ -178,7 +178,7 @@ SCENARIO("Ext2 inode handles zeros in block mappings as file holes", "[filesyste GIVEN("an ext2 indode with file holes in singly indirect blocks") { - auto device = kstd::make_shared(0, 0, "mock", block_size, 64 * block_size); + auto device = kstd::make_shared("mock", block_size, 64 * block_size); REQUIRE(device != nullptr); kernel::tests::filesystem::ext2::setup_mock_ext2_layout(*device); @@ -223,7 +223,7 @@ SCENARIO("Ext2 inode handles zeros in block mappings as file holes", "[filesyste GIVEN("an ext2 inode with zero singly indirect block pointer") { - auto device = kstd::make_shared(0, 0, "mock", block_size, 64 * block_size); + auto device = kstd::make_shared("mock", block_size, 64 * block_size); REQUIRE(device != nullptr); kernel::tests::filesystem::ext2::setup_mock_ext2_layout(*device); @@ -254,7 +254,7 @@ SCENARIO("Ext2 inode read across block boundaries", "[filesystem][ext2][inode]") auto const block_size = 1024_B; GIVEN("an ext2 inode with two direct blocks and a block size of 1024 bytes") { - auto device = kstd::make_shared(0, 0, "mock", block_size, 64 * block_size); + auto device = kstd::make_shared("mock", block_size, 64 * block_size); REQUIRE(device != nullptr); kernel::tests::filesystem::ext2::setup_mock_ext2_layout(*device); @@ -362,7 +362,7 @@ SCENARIO("Ext2 inode write across block boundaries", "[filesystem][ext2][inode]" { auto const block_size = 1024_B; - auto device = kstd::make_shared(0, 0, "mock", block_size, 128 * block_size); + auto device = kstd::make_shared("mock", block_size, 128 * block_size); REQUIRE(device != nullptr); auto superblock = kernel::filesystem::ext2::superblock{}; @@ -520,7 +520,7 @@ SCENARIO("Ext2 inode get_size() and set_size() handles size correctly depending { superblock.rev_level = 0; - auto device = kstd::make_shared(0, 0, "mock", block_size, 64 * block_size); + auto device = kstd::make_shared("mock", block_size, 64 * block_size); REQUIRE(device != nullptr); kernel::tests::filesystem::ext2::setup_mock_ext2_layout(*device, superblock); @@ -563,7 +563,7 @@ SCENARIO("Ext2 inode get_size() and set_size() handles size correctly depending { superblock.rev_level = 1; - auto device = kstd::make_shared(0, 0, "mock", block_size, 64 * block_size); + auto device = kstd::make_shared("mock", block_size, 64 * block_size); REQUIRE(device != nullptr); kernel::tests::filesystem::ext2::setup_mock_ext2_layout(*device, superblock); diff --git a/kernel/kernel/test_support/devices/block_device.cpp b/kernel/kernel/test_support/devices/block_device.cpp index f20ac48d..3052a26d 100644 --- a/kernel/kernel/test_support/devices/block_device.cpp +++ b/kernel/kernel/test_support/devices/block_device.cpp @@ -17,9 +17,8 @@ using namespace kstd::units_literals; namespace kernel::tests::devices { - block_device::block_device(size_t major, size_t minor, kstd::string const & name, kstd::units::bytes block_size, - kstd::units::bytes initial_size) - : kapi::devices::device{major, minor, name} + block_device::block_device(kstd::string const & name, kstd::units::bytes block_size, kstd::units::bytes initial_size) + : kapi::devices::device{name} , m_block_size{block_size} { data.resize(initial_size.value, 0); diff --git a/kernel/kernel/test_support/devices/block_device.hpp b/kernel/kernel/test_support/devices/block_device.hpp index 082ab003..c3a05aef 100644 --- a/kernel/kernel/test_support/devices/block_device.hpp +++ b/kernel/kernel/test_support/devices/block_device.hpp @@ -16,8 +16,7 @@ namespace kernel::tests::devices struct block_device final : kapi::devices::device, kapi::devices::block_device { - block_device(size_t major, size_t minor, kstd::string const & name, kstd::units::bytes block_size, - kstd::units::bytes initial_size = {}); + block_device(kstd::string const & name, kstd::units::bytes block_size, kstd::units::bytes initial_size = {}); auto init() -> bool override; diff --git a/kernel/kernel/test_support/devices/character_device.cpp b/kernel/kernel/test_support/devices/character_device.cpp index fef5baf5..a433fe2d 100644 --- a/kernel/kernel/test_support/devices/character_device.cpp +++ b/kernel/kernel/test_support/devices/character_device.cpp @@ -4,12 +4,10 @@ #include -#include - namespace kernel::tests::devices { - character_device::character_device(size_t major, size_t minor, kstd::string const & name) - : kapi::devices::device(major, minor, name) + character_device::character_device(kstd::string const & name) + : kapi::devices::device{name} {} auto character_device::init() -> bool diff --git a/kernel/kernel/test_support/devices/character_device.hpp b/kernel/kernel/test_support/devices/character_device.hpp index 5790a561..fe4b9370 100644 --- a/kernel/kernel/test_support/devices/character_device.hpp +++ b/kernel/kernel/test_support/devices/character_device.hpp @@ -6,14 +6,12 @@ #include #include -#include - namespace kernel::tests::devices { // TODO fix inheritance when character devices are implemented struct character_device : kapi::devices::device { - character_device(size_t major, size_t minor, kstd::string const & name); + character_device(kstd::string const & name); auto init() -> bool override; }; -- cgit v1.2.3