From f9c8470b20bea47ce6d6681b86be675b96419c02 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Sun, 15 Mar 2020 00:13:38 -0400 Subject: [PATCH] Ensure targets always nominate a machine. --- Analyser/Static/Acorn/StaticAnalyser.cpp | 1 - Analyser/Static/Acorn/Target.hpp | 2 +- Analyser/Static/AmstradCPC/StaticAnalyser.cpp | 1 - Analyser/Static/AmstradCPC/Target.hpp | 4 ++-- Analyser/Static/AppleII/StaticAnalyser.cpp | 1 - Analyser/Static/AppleII/Target.hpp | 4 ++-- Analyser/Static/Atari2600/StaticAnalyser.cpp | 1 - Analyser/Static/Atari2600/Target.hpp | 2 ++ Analyser/Static/AtariST/StaticAnalyser.cpp | 5 ++--- Analyser/Static/AtariST/Target.hpp | 6 +++++- Analyser/Static/Coleco/StaticAnalyser.cpp | 3 +-- Analyser/Static/Commodore/Target.hpp | 4 ++-- Analyser/Static/DiskII/StaticAnalyser.cpp | 2 -- Analyser/Static/MSX/StaticAnalyser.cpp | 2 -- Analyser/Static/MSX/Target.hpp | 2 +- Analyser/Static/Macintosh/StaticAnalyser.cpp | 1 - Analyser/Static/Macintosh/Target.hpp | 4 ++-- Analyser/Static/Oric/StaticAnalyser.cpp | 1 - Analyser/Static/Oric/Target.hpp | 4 ++-- Analyser/Static/Sega/StaticAnalyser.cpp | 2 -- Analyser/Static/Sega/Target.hpp | 6 +++++- Analyser/Static/StaticAnalyser.hpp | 3 ++- Analyser/Static/ZX8081/Target.hpp | 2 +- .../xcschemes/Clock Signal Kiosk.xcscheme | 4 ++-- .../Machine/StaticAnalyser/CSStaticAnalyser.mm | 13 ++----------- Reflection/Struct.h | 3 ++- 26 files changed, 36 insertions(+), 47 deletions(-) diff --git a/Analyser/Static/Acorn/StaticAnalyser.cpp b/Analyser/Static/Acorn/StaticAnalyser.cpp index 252176f56..75cafb509 100644 --- a/Analyser/Static/Acorn/StaticAnalyser.cpp +++ b/Analyser/Static/Acorn/StaticAnalyser.cpp @@ -59,7 +59,6 @@ static std::vector> Analyser::Static::TargetList Analyser::Static::Acorn::GetTargets(const Media &media, const std::string &file_name, TargetPlatform::IntType potential_platforms) { auto target = std::make_unique(); - target->machine = Machine::Electron; target->confidence = 0.5; // TODO: a proper estimation target->has_dfs = false; target->has_adfs = false; diff --git a/Analyser/Static/Acorn/Target.hpp b/Analyser/Static/Acorn/Target.hpp index 7c312e1fd..f049f3e8f 100644 --- a/Analyser/Static/Acorn/Target.hpp +++ b/Analyser/Static/Acorn/Target.hpp @@ -23,7 +23,7 @@ struct Target: public ::Analyser::Static::Target, public Reflection::StructImpl< bool should_shift_restart = false; std::string loading_command; - Target() { + Target() : Analyser::Static::Target(Machine::Electron) { if(needs_declare()) { DeclareField(has_adfs); DeclareField(has_dfs); diff --git a/Analyser/Static/AmstradCPC/StaticAnalyser.cpp b/Analyser/Static/AmstradCPC/StaticAnalyser.cpp index 7efadf16d..c45adf2b2 100644 --- a/Analyser/Static/AmstradCPC/StaticAnalyser.cpp +++ b/Analyser/Static/AmstradCPC/StaticAnalyser.cpp @@ -182,7 +182,6 @@ static bool CheckBootSector(const std::shared_ptr &disk, co Analyser::Static::TargetList Analyser::Static::AmstradCPC::GetTargets(const Media &media, const std::string &file_name, TargetPlatform::IntType potential_platforms) { TargetList destination; auto target = std::make_unique(); - target->machine = Machine::AmstradCPC; target->confidence = 0.5; target->model = Target::Model::CPC6128; diff --git a/Analyser/Static/AmstradCPC/Target.hpp b/Analyser/Static/AmstradCPC/Target.hpp index 765b2f04f..586398e6e 100644 --- a/Analyser/Static/AmstradCPC/Target.hpp +++ b/Analyser/Static/AmstradCPC/Target.hpp @@ -18,12 +18,12 @@ namespace Analyser { namespace Static { namespace AmstradCPC { -struct Target: public ::Analyser::Static::Target, public Reflection::StructImpl { +struct Target: public Analyser::Static::Target, public Reflection::StructImpl { ReflectableEnum(Model, CPC464, CPC664, CPC6128); Model model = Model::CPC464; std::string loading_command; - Target() { + Target() : Analyser::Static::Target(Machine::AmstradCPC) { if(needs_declare()) { DeclareField(model); AnnounceEnum(Model); diff --git a/Analyser/Static/AppleII/StaticAnalyser.cpp b/Analyser/Static/AppleII/StaticAnalyser.cpp index b0b280fb1..71791a743 100644 --- a/Analyser/Static/AppleII/StaticAnalyser.cpp +++ b/Analyser/Static/AppleII/StaticAnalyser.cpp @@ -11,7 +11,6 @@ Analyser::Static::TargetList Analyser::Static::AppleII::GetTargets(const Media &media, const std::string &file_name, TargetPlatform::IntType potential_platforms) { auto target = std::make_unique(); - target->machine = Machine::AppleII; target->media = media; if(!target->media.disks.empty()) diff --git a/Analyser/Static/AppleII/Target.hpp b/Analyser/Static/AppleII/Target.hpp index e1a6141cc..eb67b2af2 100644 --- a/Analyser/Static/AppleII/Target.hpp +++ b/Analyser/Static/AppleII/Target.hpp @@ -17,7 +17,7 @@ namespace Analyser { namespace Static { namespace AppleII { -struct Target: public ::Analyser::Static::Target, public Reflection::StructImpl { +struct Target: public Analyser::Static::Target, public Reflection::StructImpl { ReflectableEnum(Model, II, IIplus, @@ -33,7 +33,7 @@ struct Target: public ::Analyser::Static::Target, public Reflection::StructImpl< Model model = Model::IIe; DiskController disk_controller = DiskController::None; - Target() { + Target() : Analyser::Static::Target(Machine::AppleII) { if(needs_declare()) { DeclareField(model); DeclareField(disk_controller); diff --git a/Analyser/Static/Atari2600/StaticAnalyser.cpp b/Analyser/Static/Atari2600/StaticAnalyser.cpp index cd756e59e..9b627de38 100644 --- a/Analyser/Static/Atari2600/StaticAnalyser.cpp +++ b/Analyser/Static/Atari2600/StaticAnalyser.cpp @@ -184,7 +184,6 @@ static void DeterminePagingForCartridge(Target &target, const Storage::Cartridge Analyser::Static::TargetList Analyser::Static::Atari2600::GetTargets(const Media &media, const std::string &file_name, TargetPlatform::IntType potential_platforms) { // TODO: sanity checking; is this image really for an Atari 2600? auto target = std::make_unique(); - target->machine = Machine::Atari2600; target->confidence = 0.5; target->media.cartridges = media.cartridges; target->paging_model = Target::PagingModel::None; diff --git a/Analyser/Static/Atari2600/Target.hpp b/Analyser/Static/Atari2600/Target.hpp index 4bd4c5384..c372656ff 100644 --- a/Analyser/Static/Atari2600/Target.hpp +++ b/Analyser/Static/Atari2600/Target.hpp @@ -34,6 +34,8 @@ struct Target: public ::Analyser::Static::Target { // TODO: shouldn't these be properties of the cartridge? PagingModel paging_model = PagingModel::None; bool uses_superchip = false; + + Target() : Analyser::Static::Target(Machine::Atari2600) {} }; } diff --git a/Analyser/Static/AtariST/StaticAnalyser.cpp b/Analyser/Static/AtariST/StaticAnalyser.cpp index b46d0e17d..e2896aa6d 100644 --- a/Analyser/Static/AtariST/StaticAnalyser.cpp +++ b/Analyser/Static/AtariST/StaticAnalyser.cpp @@ -16,9 +16,8 @@ Analyser::Static::TargetList Analyser::Static::AtariST::GetTargets(const Media & // As there is at least one usable media image, wave it through. Analyser::Static::TargetList targets; - using Target = Analyser::Static::Target; - auto *target = new Target; - target->machine = Analyser::Machine::AtariST; + using Target = Analyser::Static::AtariST::Target; + auto *target = new Target(); target->media = media; targets.push_back(std::unique_ptr(target)); diff --git a/Analyser/Static/AtariST/Target.hpp b/Analyser/Static/AtariST/Target.hpp index f9c6f2828..4933c8776 100644 --- a/Analyser/Static/AtariST/Target.hpp +++ b/Analyser/Static/AtariST/Target.hpp @@ -9,11 +9,15 @@ #ifndef Analyser_Static_AtariST_Target_h #define Analyser_Static_AtariST_Target_h +#include "../../../Reflection/Struct.h" +#include "../StaticAnalyser.hpp" + namespace Analyser { namespace Static { namespace AtariST { -struct Target: public ::Analyser::Static::Target { +struct Target: public Analyser::Static::Target, public Reflection::StructImpl { + Target() : Analyser::Static::Target(Machine::AtariST) {} }; } diff --git a/Analyser/Static/Coleco/StaticAnalyser.cpp b/Analyser/Static/Coleco/StaticAnalyser.cpp index 25f69e926..34abed780 100644 --- a/Analyser/Static/Coleco/StaticAnalyser.cpp +++ b/Analyser/Static/Coleco/StaticAnalyser.cpp @@ -54,8 +54,7 @@ static std::vector> Analyser::Static::TargetList Analyser::Static::Coleco::GetTargets(const Media &media, const std::string &file_name, TargetPlatform::IntType potential_platforms) { TargetList targets; - auto target = std::make_unique(); - target->machine = Machine::ColecoVision; + auto target = std::make_unique(Machine::ColecoVision); target->confidence = 1.0f - 1.0f / 32768.0f; target->media.cartridges = ColecoCartridgesFrom(media.cartridges); if(!target->media.empty()) diff --git a/Analyser/Static/Commodore/Target.hpp b/Analyser/Static/Commodore/Target.hpp index d207cf0bd..dd08b87d9 100644 --- a/Analyser/Static/Commodore/Target.hpp +++ b/Analyser/Static/Commodore/Target.hpp @@ -18,7 +18,7 @@ namespace Analyser { namespace Static { namespace Commodore { -struct Target: public ::Analyser::Static::Target, public Reflection::StructImpl { +struct Target: public Analyser::Static::Target, public Reflection::StructImpl { enum class MemoryModel { Unexpanded, EightKB, @@ -57,7 +57,7 @@ struct Target: public ::Analyser::Static::Target, public Reflection::StructImpl< bool has_c1540 = false; std::string loading_command; - Target() { + Target() : Analyser::Static::Target(Machine::Vic20) { if(needs_declare()) { DeclareField(enabled_ram.bank0); DeclareField(enabled_ram.bank1); diff --git a/Analyser/Static/DiskII/StaticAnalyser.cpp b/Analyser/Static/DiskII/StaticAnalyser.cpp index 5e8824ac2..56c7c5d3f 100644 --- a/Analyser/Static/DiskII/StaticAnalyser.cpp +++ b/Analyser/Static/DiskII/StaticAnalyser.cpp @@ -21,7 +21,6 @@ namespace { Analyser::Static::Target *AppleTarget(const Storage::Encodings::AppleGCR::Sector *sector_zero) { using Target = Analyser::Static::AppleII::Target; auto *target = new Target; - target->machine = Analyser::Machine::AppleII; if(sector_zero && sector_zero->encoding == Storage::Encodings::AppleGCR::Sector::Encoding::FiveAndThree) { target->disk_controller = Target::DiskController::ThirteenSector; @@ -35,7 +34,6 @@ Analyser::Static::Target *AppleTarget(const Storage::Encodings::AppleGCR::Sector Analyser::Static::Target *OricTarget(const Storage::Encodings::AppleGCR::Sector *sector_zero) { using Target = Analyser::Static::Oric::Target; auto *target = new Target; - target->machine = Analyser::Machine::Oric; target->rom = Target::ROM::Pravetz; target->disk_interface = Target::DiskInterface::Pravetz; target->loading_command = "CALL 800\n"; diff --git a/Analyser/Static/MSX/StaticAnalyser.cpp b/Analyser/Static/MSX/StaticAnalyser.cpp index a20350ca9..7342a793c 100644 --- a/Analyser/Static/MSX/StaticAnalyser.cpp +++ b/Analyser/Static/MSX/StaticAnalyser.cpp @@ -35,7 +35,6 @@ static std::unique_ptr CartridgeTarget( } auto target = std::make_unique(); - target->machine = Analyser::Machine::MSX; target->confidence = confidence; if(type == Analyser::Static::MSX::Cartridge::Type::None) { @@ -295,7 +294,6 @@ Analyser::Static::TargetList Analyser::Static::MSX::GetTargets(const Media &medi target->has_disk_drive = !media.disks.empty(); if(!target->media.empty()) { - target->machine = Machine::MSX; target->confidence = 0.5; destination.push_back(std::move(target)); } diff --git a/Analyser/Static/MSX/Target.hpp b/Analyser/Static/MSX/Target.hpp index f7c7ddbac..7e16ae25a 100644 --- a/Analyser/Static/MSX/Target.hpp +++ b/Analyser/Static/MSX/Target.hpp @@ -29,7 +29,7 @@ struct Target: public ::Analyser::Static::Target, public Reflection::StructImpl< ); Region region = Region::USA; - Target() { + Target(): Analyser::Static::Target(Machine::MSX) { if(needs_declare()) { DeclareField(has_disk_drive); DeclareField(region); diff --git a/Analyser/Static/Macintosh/StaticAnalyser.cpp b/Analyser/Static/Macintosh/StaticAnalyser.cpp index 1dc76db84..d14a69554 100644 --- a/Analyser/Static/Macintosh/StaticAnalyser.cpp +++ b/Analyser/Static/Macintosh/StaticAnalyser.cpp @@ -18,7 +18,6 @@ Analyser::Static::TargetList Analyser::Static::Macintosh::GetTargets(const Media using Target = Analyser::Static::Macintosh::Target; auto *target = new Target; - target->machine = Analyser::Machine::Macintosh; target->media = media; targets.push_back(std::unique_ptr(target)); diff --git a/Analyser/Static/Macintosh/Target.hpp b/Analyser/Static/Macintosh/Target.hpp index 9b8aab7e7..905739429 100644 --- a/Analyser/Static/Macintosh/Target.hpp +++ b/Analyser/Static/Macintosh/Target.hpp @@ -16,11 +16,11 @@ namespace Analyser { namespace Static { namespace Macintosh { -struct Target: public ::Analyser::Static::Target, public Reflection::StructImpl { +struct Target: public Analyser::Static::Target, public Reflection::StructImpl { ReflectableEnum(Model, Mac128k, Mac512k, Mac512ke, MacPlus); Model model = Model::MacPlus; - Target() { + Target() : Analyser::Static::Target(Machine::Macintosh) { // Boilerplate for declaring fields and potential values. if(needs_declare()) { DeclareField(model); diff --git a/Analyser/Static/Oric/StaticAnalyser.cpp b/Analyser/Static/Oric/StaticAnalyser.cpp index 3a39c4eb4..22d607f29 100644 --- a/Analyser/Static/Oric/StaticAnalyser.cpp +++ b/Analyser/Static/Oric/StaticAnalyser.cpp @@ -147,7 +147,6 @@ bool is_bd500(Storage::Encodings::MFM::Parser &parser) { Analyser::Static::TargetList Analyser::Static::Oric::GetTargets(const Media &media, const std::string &file_name, TargetPlatform::IntType potential_platforms) { auto target = std::make_unique(); - target->machine = Machine::Oric; target->confidence = 0.5; int basic10_votes = 0; diff --git a/Analyser/Static/Oric/Target.hpp b/Analyser/Static/Oric/Target.hpp index 114b6a4a3..e0f81f6d7 100644 --- a/Analyser/Static/Oric/Target.hpp +++ b/Analyser/Static/Oric/Target.hpp @@ -18,7 +18,7 @@ namespace Analyser { namespace Static { namespace Oric { -struct Target: public ::Analyser::Static::Target, public Reflection::StructImpl { +struct Target: public Analyser::Static::Target, public Reflection::StructImpl { ReflectableEnum(ROM, BASIC10, BASIC11, @@ -38,7 +38,7 @@ struct Target: public ::Analyser::Static::Target, public Reflection::StructImpl< std::string loading_command; bool should_start_jasmin = false; - Target() { + Target(): Analyser::Static::Target(Machine::Oric) { if(needs_declare()) { DeclareField(rom); DeclareField(disk_interface); diff --git a/Analyser/Static/Sega/StaticAnalyser.cpp b/Analyser/Static/Sega/StaticAnalyser.cpp index 37b9d54d4..7e0db0c84 100644 --- a/Analyser/Static/Sega/StaticAnalyser.cpp +++ b/Analyser/Static/Sega/StaticAnalyser.cpp @@ -20,8 +20,6 @@ Analyser::Static::TargetList Analyser::Static::Sega::GetTargets(const Media &med TargetList targets; auto target = std::make_unique(); - target->machine = Machine::MasterSystem; - // Files named .sg are treated as for the SG1000; otherwise assume a Master System. if(file_name.size() >= 2 && *(file_name.end() - 2) == 's' && *(file_name.end() - 1) == 'g') { target->model = Target::Model::SG1000; diff --git a/Analyser/Static/Sega/Target.hpp b/Analyser/Static/Sega/Target.hpp index f95766ab6..1735704ed 100644 --- a/Analyser/Static/Sega/Target.hpp +++ b/Analyser/Static/Sega/Target.hpp @@ -9,11 +9,13 @@ #ifndef Analyser_Static_Sega_Target_h #define Analyser_Static_Sega_Target_h +#include "../StaticAnalyser.hpp" + namespace Analyser { namespace Static { namespace Sega { -struct Target: public ::Analyser::Static::Target { +struct Target: public Analyser::Static::Target { enum class Model { SG1000, MasterSystem, @@ -35,6 +37,8 @@ struct Target: public ::Analyser::Static::Target { Model model = Model::MasterSystem; Region region = Region::Japan; PagingScheme paging_scheme = PagingScheme::Sega; + + Target() : Analyser::Static::Target(Machine::MasterSystem) {} }; #define is_master_system(v) v >= Analyser::Static::Sega::Target::Model::MasterSystem diff --git a/Analyser/Static/StaticAnalyser.hpp b/Analyser/Static/StaticAnalyser.hpp index 5981fc435..b9a62770d 100644 --- a/Analyser/Static/StaticAnalyser.hpp +++ b/Analyser/Static/StaticAnalyser.hpp @@ -42,11 +42,12 @@ struct Media { and instructions on how to launch the software attached, plus a measure of confidence in this target's correctness. */ struct Target { + Target(Machine machine) : machine(machine) {} virtual ~Target() {} Machine machine; Media media; - float confidence; + float confidence = 0.0f; }; typedef std::vector> TargetList; diff --git a/Analyser/Static/ZX8081/Target.hpp b/Analyser/Static/ZX8081/Target.hpp index b85e2cce8..3461974ed 100644 --- a/Analyser/Static/ZX8081/Target.hpp +++ b/Analyser/Static/ZX8081/Target.hpp @@ -30,7 +30,7 @@ struct Target: public ::Analyser::Static::Target, public Reflection::StructImpl< bool ZX80_uses_ZX81_ROM = false; std::string loading_command; - Target() { + Target(): Analyser::Static::Target(Machine::ZX8081) { if(needs_declare()) { DeclareField(memory_model); DeclareField(is_ZX81); diff --git a/OSBindings/Mac/Clock Signal.xcodeproj/xcshareddata/xcschemes/Clock Signal Kiosk.xcscheme b/OSBindings/Mac/Clock Signal.xcodeproj/xcshareddata/xcschemes/Clock Signal Kiosk.xcscheme index 5a6721911..6f2dd2302 100644 --- a/OSBindings/Mac/Clock Signal.xcodeproj/xcshareddata/xcschemes/Clock Signal Kiosk.xcscheme +++ b/OSBindings/Mac/Clock Signal.xcodeproj/xcshareddata/xcschemes/Clock Signal Kiosk.xcscheme @@ -79,11 +79,11 @@ + isEnabled = "YES"> + isEnabled = "YES"> (); - target->machine = Analyser::Machine::Electron; target->has_dfs = !!dfs; target->has_adfs = !!adfs; _targets.push_back(std::move(target)); @@ -59,7 +59,6 @@ if(self) { using Target = Analyser::Static::AmstradCPC::Target; auto target = std::make_unique(); - target->machine = Analyser::Machine::AmstradCPC; switch(model) { case CSMachineCPCModel464: target->model = Analyser::Static::AmstradCPC::Target::Model::CPC464; break; case CSMachineCPCModel664: target->model = Analyser::Static::AmstradCPC::Target::Model::CPC664; break; @@ -75,7 +74,6 @@ if(self) { using Target = Analyser::Static::MSX::Target; auto target = std::make_unique(); - target->machine = Analyser::Machine::MSX; target->has_disk_drive = !!hasDiskDrive; switch(region) { case CSMachineMSXRegionAmerican: target->region = Analyser::Static::MSX::Target::Region::USA; break; @@ -92,7 +90,6 @@ if(self) { using Target = Analyser::Static::Oric::Target; auto target = std::make_unique(); - target->machine = Analyser::Machine::Oric; switch(model) { case CSMachineOricModelOric1: target->rom = Target::ROM::BASIC10; break; case CSMachineOricModelOricAtmos: target->rom = Target::ROM::BASIC11; break; @@ -115,7 +112,6 @@ if(self) { using Target = Analyser::Static::Commodore::Target; auto target = std::make_unique(); - target->machine = Analyser::Machine::Vic20; switch(region) { case CSMachineVic20RegionDanish: target->region = Target::Region::Danish; break; case CSMachineVic20RegionSwedish: target->region = Target::Region::Swedish; break; @@ -150,7 +146,6 @@ static Analyser::Static::ZX8081::Target::MemoryModel ZX8081MemoryModelFromSize(K if(self) { using Target = Analyser::Static::ZX8081::Target; auto target = std::make_unique(); - target->machine = Analyser::Machine::ZX8081; target->is_ZX81 = false; target->ZX80_uses_ZX81_ROM = !!useZX81ROM; target->memory_model = ZX8081MemoryModelFromSize(memorySize); @@ -164,7 +159,6 @@ static Analyser::Static::ZX8081::Target::MemoryModel ZX8081MemoryModelFromSize(K if(self) { using Target = Analyser::Static::ZX8081::Target; auto target = std::make_unique(); - target->machine = Analyser::Machine::ZX8081; target->is_ZX81 = true; target->memory_model = ZX8081MemoryModelFromSize(memorySize); _targets.push_back(std::move(target)); @@ -177,7 +171,6 @@ static Analyser::Static::ZX8081::Target::MemoryModel ZX8081MemoryModelFromSize(K if(self) { using Target = Analyser::Static::AppleII::Target; auto target = std::make_unique(); - target->machine = Analyser::Machine::AppleII; switch(model) { default: target->model = Target::Model::II; break; case CSMachineAppleIIModelAppleIIPlus: target->model = Target::Model::IIplus; break; @@ -200,7 +193,6 @@ static Analyser::Static::ZX8081::Target::MemoryModel ZX8081MemoryModelFromSize(K if(self) { using Target = Analyser::Static::Macintosh::Target; auto target = std::make_unique(); - target->machine = Analyser::Machine::Macintosh; using Model = Target::Model; switch(model) { @@ -219,9 +211,8 @@ static Analyser::Static::ZX8081::Target::MemoryModel ZX8081MemoryModelFromSize(K - (instancetype)initWithAtariSTModel:(CSMachineAtariSTModel)model { self = [super init]; if(self) { - using Target = Analyser::Static::Macintosh::Target; + using Target = Analyser::Static::AtariST::Target; auto target = std::make_unique(); - target->machine = Analyser::Machine::AtariST; _targets.push_back(std::move(target)); } return self; diff --git a/Reflection/Struct.h b/Reflection/Struct.h index 65adec45a..9dcf0ac2a 100644 --- a/Reflection/Struct.h +++ b/Reflection/Struct.h @@ -139,7 +139,8 @@ template class StructImpl: public Struct { private: struct Field { const std::type_info *type; - ssize_t offset, size; + ssize_t offset; + size_t size; Field(const std::type_info &type, ssize_t offset, size_t size) : type(&type), offset(offset), size(size) {} };