diff --git a/.github/workflows/ccpp.yml b/.github/workflows/ccpp.yml index 9fe71508..07059950 100644 --- a/.github/workflows/ccpp.yml +++ b/.github/workflows/ccpp.yml @@ -46,7 +46,7 @@ jobs: path: 'fluxengine-testdata' - name: brew run: | - brew install sqlite pkg-config libusb protobuf wxwidgets fmt make coreutils dylibbundler libjpeg libmagic nlohmann-json cli11 boost glfw3 md4c ninja python freetype2 mbedtls@3 lunasvg + brew install sqlite pkg-config libusb protobuf wxwidgets fmt make coreutils dylibbundler libjpeg libmagic nlohmann-json cli11 boost glfw3 md4c ninja python freetype2 mbedtls@3 lunasvg libgc brew link mbedtls@3 brew upgrade - name: make @@ -77,6 +77,7 @@ jobs: pacboy: | protobuf:p pkgconf:p curl-winssl:p file:p glfw:p mbedtls:p sqlite:p freetype:p boost:p gcc:p binutils:p nsis:p abseil-cpp:p + gc:p - name: debug run: | diff --git a/arch/aeslanier/aeslanier.h b/arch/aeslanier/aeslanier.h index 76b7371e..2fd1a5b6 100644 --- a/arch/aeslanier/aeslanier.h +++ b/arch/aeslanier/aeslanier.h @@ -5,7 +5,6 @@ #define AESLANIER_SECTOR_LENGTH 256 #define AESLANIER_RECORD_SIZE (AESLANIER_SECTOR_LENGTH + 5) -extern std::unique_ptr createAesLanierDecoder( - const DecoderProto& config); +extern Decoder* createAesLanierDecoder(const DecoderProto& config); #endif diff --git a/arch/aeslanier/decoder.cc b/arch/aeslanier/decoder.cc index 68417af1..2ba2594c 100644 --- a/arch/aeslanier/decoder.cc +++ b/arch/aeslanier/decoder.cc @@ -59,7 +59,7 @@ class AesLanierDecoder : public Decoder } }; -std::unique_ptr createAesLanierDecoder(const DecoderProto& config) +Decoder* createAesLanierDecoder(const DecoderProto& config) { - return std::unique_ptr(new AesLanierDecoder(config)); + return new AesLanierDecoder(config); } diff --git a/arch/agat/agat.h b/arch/agat/agat.h index 0d3a50c1..5d4064e0 100644 --- a/arch/agat/agat.h +++ b/arch/agat/agat.h @@ -11,8 +11,8 @@ class EncoderProto; class Decoder; class DecoderProto; -extern std::unique_ptr createAgatDecoder(const DecoderProto& config); -extern std::unique_ptr createAgatEncoder(const EncoderProto& config); +extern Decoder* createAgatDecoder(const DecoderProto& config); +extern Encoder* createAgatEncoder(const EncoderProto& config); extern uint8_t agatChecksum(const Bytes& bytes); diff --git a/arch/agat/decoder.cc b/arch/agat/decoder.cc index 4674d764..0e9693bf 100644 --- a/arch/agat/decoder.cc +++ b/arch/agat/decoder.cc @@ -84,7 +84,7 @@ class AgatDecoder : public Decoder } }; -std::unique_ptr createAgatDecoder(const DecoderProto& config) +Decoder* createAgatDecoder(const DecoderProto& config) { - return std::unique_ptr(new AgatDecoder(config)); + return new AgatDecoder(config); } diff --git a/arch/agat/encoder.cc b/arch/agat/encoder.cc index 573075b4..ff025b78 100644 --- a/arch/agat/encoder.cc +++ b/arch/agat/encoder.cc @@ -58,8 +58,8 @@ class AgatEncoder : public Encoder }; public: - std::unique_ptr encode(const LogicalTrackLayout& ltl, - const std::vector>& sectors, + std::unique_ptr encode(const LogicalTrackLayout* ltl, + const std::vector& sectors, const Image& image) override { double clockRateUs = _config.target_clock_period_us() / 2.0; @@ -109,7 +109,7 @@ class AgatEncoder : public Encoder std::vector _bits; }; -std::unique_ptr createAgatEncoder(const EncoderProto& config) +Encoder* createAgatEncoder(const EncoderProto& config) { - return std::unique_ptr(new AgatEncoder(config)); + return new AgatEncoder(config); } diff --git a/arch/amiga/amiga.h b/arch/amiga/amiga.h index 838691f9..1169c338 100644 --- a/arch/amiga/amiga.h +++ b/arch/amiga/amiga.h @@ -9,8 +9,8 @@ #define AMIGA_SECTORS_PER_TRACK 11 #define AMIGA_RECORD_SIZE 0x21c -extern std::unique_ptr createAmigaDecoder(const DecoderProto& config); -extern std::unique_ptr createAmigaEncoder(const EncoderProto& config); +extern Decoder* createAmigaDecoder(const DecoderProto& config); +extern Encoder* createAmigaEncoder(const EncoderProto& config); extern uint32_t amigaChecksum(const Bytes& bytes); extern Bytes amigaInterleave(const Bytes& input); diff --git a/arch/amiga/decoder.cc b/arch/amiga/decoder.cc index 901a0e66..d9cdc93a 100644 --- a/arch/amiga/decoder.cc +++ b/arch/amiga/decoder.cc @@ -79,7 +79,7 @@ class AmigaDecoder : public Decoder nanoseconds_t _clock; }; -std::unique_ptr createAmigaDecoder(const DecoderProto& config) +Decoder* createAmigaDecoder(const DecoderProto& config) { - return std::unique_ptr(new AmigaDecoder(config)); + return new AmigaDecoder(config); } diff --git a/arch/amiga/encoder.cc b/arch/amiga/encoder.cc index a74acb77..14692798 100644 --- a/arch/amiga/encoder.cc +++ b/arch/amiga/encoder.cc @@ -54,9 +54,8 @@ static void write_bits( } } -static void write_sector(std::vector& bits, - unsigned& cursor, - const std::shared_ptr& sector) +static void write_sector( + std::vector& bits, unsigned& cursor, const Sector* sector) { if ((sector->data.size() != 512) && (sector->data.size() != 528)) error("unsupported sector size --- you must pick 512 or 528"); @@ -110,8 +109,8 @@ class AmigaEncoder : public Encoder } public: - std::unique_ptr encode(const LogicalTrackLayout& ltl, - const std::vector>& sectors, + std::unique_ptr encode(const LogicalTrackLayout* ltl, + const std::vector& sectors, const Image& image) override { /* Number of bits for one nominal revolution of a real 200ms Amiga disk. @@ -143,7 +142,7 @@ class AmigaEncoder : public Encoder const AmigaEncoderProto& _config; }; -std::unique_ptr createAmigaEncoder(const EncoderProto& config) +Encoder* createAmigaEncoder(const EncoderProto& config) { - return std::unique_ptr(new AmigaEncoder(config)); + return new AmigaEncoder(config); } diff --git a/arch/apple2/apple2.h b/arch/apple2/apple2.h index a7eec2a6..4b31e20b 100644 --- a/arch/apple2/apple2.h +++ b/arch/apple2/apple2.h @@ -13,7 +13,7 @@ #define APPLE2_SECTORS 16 -extern std::unique_ptr createApple2Decoder(const DecoderProto& config); -extern std::unique_ptr createApple2Encoder(const EncoderProto& config); +extern Decoder* createApple2Decoder(const DecoderProto& config); +extern Encoder* createApple2Encoder(const EncoderProto& config); #endif diff --git a/arch/apple2/decoder.cc b/arch/apple2/decoder.cc index bc8cb8f9..d8614a26 100644 --- a/arch/apple2/decoder.cc +++ b/arch/apple2/decoder.cc @@ -172,7 +172,7 @@ class Apple2Decoder : public Decoder } }; -std::unique_ptr createApple2Decoder(const DecoderProto& config) +Decoder* createApple2Decoder(const DecoderProto& config) { - return std::unique_ptr(new Apple2Decoder(config)); + return new Apple2Decoder(config); } diff --git a/arch/apple2/encoder.cc b/arch/apple2/encoder.cc index 257ede5b..c4d444a1 100644 --- a/arch/apple2/encoder.cc +++ b/arch/apple2/encoder.cc @@ -36,8 +36,8 @@ class Apple2Encoder : public Encoder const Apple2EncoderProto& _config; public: - std::unique_ptr encode(const LogicalTrackLayout& ltl, - const std::vector>& sectors, + std::unique_ptr encode(const LogicalTrackLayout* ltl, + const std::vector& sectors, const Image& image) override { int bitsPerRevolution = @@ -186,7 +186,7 @@ class Apple2Encoder : public Encoder } }; -std::unique_ptr createApple2Encoder(const EncoderProto& config) +Encoder* createApple2Encoder(const EncoderProto& config) { - return std::unique_ptr(new Apple2Encoder(config)); + return new Apple2Encoder(config); } diff --git a/arch/arch.cc b/arch/arch.cc index 58bc7515..3d86f2ad 100644 --- a/arch/arch.cc +++ b/arch/arch.cc @@ -23,17 +23,16 @@ #include "arch/zilogmcz/zilogmcz.h" #include "arch/arch.h" -std::unique_ptr Arch::createEncoder(Config& config) +Encoder* Arch::createEncoder(Config& config) { if (!config.hasEncoder()) error("no encoder configured"); return createEncoder(config->encoder()); } -std::unique_ptr Arch::createEncoder(const EncoderProto& config) +Encoder* Arch::createEncoder(const EncoderProto& config) { - static const std::map(const EncoderProto&)>> + static const std::map> encoders = { {EncoderProto::kAgat, createAgatEncoder }, {EncoderProto::kAmiga, createAmigaEncoder }, @@ -56,17 +55,16 @@ std::unique_ptr Arch::createEncoder(const EncoderProto& config) return (encoder->second)(config); } -std::unique_ptr Arch::createDecoder(Config& config) +Decoder* Arch::createDecoder(Config& config) { if (!config.hasDecoder()) error("no decoder configured"); return createDecoder(config->decoder()); } -std::unique_ptr Arch::createDecoder(const DecoderProto& config) +Decoder* Arch::createDecoder(const DecoderProto& config) { - static const std::map(const DecoderProto&)>> + static const std::map> decoders = { {DecoderProto::kAgat, createAgatDecoder }, {DecoderProto::kAeslanier, createAesLanierDecoder }, diff --git a/arch/arch.h b/arch/arch.h index 00e35501..40d549af 100644 --- a/arch/arch.h +++ b/arch/arch.h @@ -8,9 +8,9 @@ class Config; namespace Arch { - std::unique_ptr createDecoder(Config& config); - std::unique_ptr createDecoder(const DecoderProto& config); + Decoder* createDecoder(Config& config); + Decoder* createDecoder(const DecoderProto& config); - std::unique_ptr createEncoder(Config& config); - std::unique_ptr createEncoder(const EncoderProto& config); + Encoder* createEncoder(Config& config); + Encoder* createEncoder(const EncoderProto& config); } diff --git a/arch/brother/brother.h b/arch/brother/brother.h index 3818c6c9..ee42a55a 100644 --- a/arch/brother/brother.h +++ b/arch/brother/brother.h @@ -13,9 +13,7 @@ #define BROTHER_TRACKS_PER_120KB_DISK 39 #define BROTHER_SECTORS_PER_TRACK 12 -extern std::unique_ptr createBrotherDecoder( - const DecoderProto& config); -extern std::unique_ptr createBrotherEncoder( - const EncoderProto& config); +extern Decoder* createBrotherDecoder(const DecoderProto& config); +extern Encoder* createBrotherEncoder(const EncoderProto& config); #endif diff --git a/arch/brother/decoder.cc b/arch/brother/decoder.cc index 753fe8fc..882cd91a 100644 --- a/arch/brother/decoder.cc +++ b/arch/brother/decoder.cc @@ -116,7 +116,7 @@ class BrotherDecoder : public Decoder } }; -std::unique_ptr createBrotherDecoder(const DecoderProto& config) +Decoder* createBrotherDecoder(const DecoderProto& config) { - return std::unique_ptr(new BrotherDecoder(config)); + return new BrotherDecoder(config); } diff --git a/arch/brother/encoder.cc b/arch/brother/encoder.cc index 171c09aa..19134232 100644 --- a/arch/brother/encoder.cc +++ b/arch/brother/encoder.cc @@ -107,8 +107,8 @@ class BrotherEncoder : public Encoder } public: - std::unique_ptr encode(const LogicalTrackLayout& ltl, - const std::vector>& sectors, + std::unique_ptr encode(const LogicalTrackLayout* ltl, + const std::vector& sectors, const Image& image) override { int bitsPerRevolution = 200000.0 / _config.clock_rate_us(); @@ -148,7 +148,7 @@ class BrotherEncoder : public Encoder const BrotherEncoderProto& _config; }; -std::unique_ptr createBrotherEncoder(const EncoderProto& config) +Encoder* createBrotherEncoder(const EncoderProto& config) { - return std::unique_ptr(new BrotherEncoder(config)); + return new BrotherEncoder(config); } diff --git a/arch/c64/c64.h b/arch/c64/c64.h index 32033632..dfea73f2 100644 --- a/arch/c64/c64.h +++ b/arch/c64/c64.h @@ -27,10 +27,8 @@ #define C64_TRACKS_PER_DISK 40 #define C64_BAM_TRACK 17 -extern std::unique_ptr createCommodore64Decoder( - const DecoderProto& config); -extern std::unique_ptr createCommodore64Encoder( - const EncoderProto& config); +extern Decoder* createCommodore64Decoder(const DecoderProto& config); +extern Encoder* createCommodore64Encoder(const EncoderProto& config); extern nanoseconds_t clockPeriodForC64Track(unsigned track); diff --git a/arch/c64/decoder.cc b/arch/c64/decoder.cc index fd3072ca..de679f4a 100644 --- a/arch/c64/decoder.cc +++ b/arch/c64/decoder.cc @@ -97,7 +97,7 @@ class Commodore64Decoder : public Decoder } }; -std::unique_ptr createCommodore64Decoder(const DecoderProto& config) +Decoder* createCommodore64Decoder(const DecoderProto& config) { - return std::unique_ptr(new Commodore64Decoder(config)); + return new Commodore64Decoder(config); } diff --git a/arch/c64/encoder.cc b/arch/c64/encoder.cc index 307e5e69..15c0f07e 100644 --- a/arch/c64/encoder.cc +++ b/arch/c64/encoder.cc @@ -155,8 +155,8 @@ class Commodore64Encoder : public Encoder } public: - std::unique_ptr encode(const LogicalTrackLayout& ltl, - const std::vector>& sectors, + std::unique_ptr encode(const LogicalTrackLayout* ltl, + const std::vector& sectors, const Image& image) override { /* The format ID Character # 1 and # 2 are in the .d64 image only @@ -178,7 +178,7 @@ class Commodore64Encoder : public Encoder else _formatByte1 = _formatByte2 = 0; - double clockRateUs = clockPeriodForC64Track(ltl.logicalCylinder); + double clockRateUs = clockPeriodForC64Track(ltl->logicalCylinder); int bitsPerRevolution = 200000.0 / clockRateUs; std::vector bits(bitsPerRevolution); @@ -204,9 +204,8 @@ class Commodore64Encoder : public Encoder } private: - void writeSector(std::vector& bits, - unsigned& cursor, - std::shared_ptr sector) const + void writeSector( + std::vector& bits, unsigned& cursor, const Sector* sector) const { /* Source: http://www.unusedino.de/ec64/technical/formats/g64.html * 1. Header sync FF FF FF FF FF (40 'on' bits, not GCR) @@ -310,9 +309,9 @@ class Commodore64Encoder : public Encoder uint8_t _formatByte2; }; -std::unique_ptr createCommodore64Encoder(const EncoderProto& config) +Encoder* createCommodore64Encoder(const EncoderProto& config) { - return std::unique_ptr(new Commodore64Encoder(config)); + return new Commodore64Encoder(config); } // vim: sw=4 ts=4 et diff --git a/arch/f85/decoder.cc b/arch/f85/decoder.cc index 1ff6b51b..39fcc35d 100644 --- a/arch/f85/decoder.cc +++ b/arch/f85/decoder.cc @@ -105,7 +105,7 @@ class DurangoF85Decoder : public Decoder } }; -std::unique_ptr createDurangoF85Decoder(const DecoderProto& config) +Decoder* createDurangoF85Decoder(const DecoderProto& config) { - return std::unique_ptr(new DurangoF85Decoder(config)); + return new DurangoF85Decoder(config); } diff --git a/arch/f85/f85.h b/arch/f85/f85.h index f720723f..56fb1d1b 100644 --- a/arch/f85/f85.h +++ b/arch/f85/f85.h @@ -5,7 +5,6 @@ #define F85_DATA_RECORD 0xffffcb /* 1111 1111 1111 1111 1100 1101 */ #define F85_SECTOR_LENGTH 512 -extern std::unique_ptr createDurangoF85Decoder( - const DecoderProto& config); +extern Decoder* createDurangoF85Decoder(const DecoderProto& config); #endif diff --git a/arch/fb100/decoder.cc b/arch/fb100/decoder.cc index 3241c22c..78715ce8 100644 --- a/arch/fb100/decoder.cc +++ b/arch/fb100/decoder.cc @@ -137,7 +137,7 @@ class Fb100Decoder : public Decoder } }; -std::unique_ptr createFb100Decoder(const DecoderProto& config) +Decoder* createFb100Decoder(const DecoderProto& config) { - return std::unique_ptr(new Fb100Decoder(config)); + return new Fb100Decoder(config); } diff --git a/arch/fb100/fb100.h b/arch/fb100/fb100.h index 7dbc22ec..4c810dfd 100644 --- a/arch/fb100/fb100.h +++ b/arch/fb100/fb100.h @@ -5,6 +5,6 @@ #define FB100_ID_SIZE 17 #define FB100_PAYLOAD_SIZE 0x500 -extern std::unique_ptr createFb100Decoder(const DecoderProto& config); +extern Decoder* createFb100Decoder(const DecoderProto& config); #endif diff --git a/arch/ibm/decoder.cc b/arch/ibm/decoder.cc index fd142bea..2e50f0f9 100644 --- a/arch/ibm/decoder.cc +++ b/arch/ibm/decoder.cc @@ -241,7 +241,7 @@ class IbmDecoder : public Decoder unsigned _currentHeaderLength; }; -std::unique_ptr createIbmDecoder(const DecoderProto& config) +Decoder* createIbmDecoder(const DecoderProto& config) { - return std::unique_ptr(new IbmDecoder(config)); + return new IbmDecoder(config); } diff --git a/arch/ibm/encoder.cc b/arch/ibm/encoder.cc index 17a3e8b6..93629c5b 100644 --- a/arch/ibm/encoder.cc +++ b/arch/ibm/encoder.cc @@ -107,12 +107,12 @@ class IbmEncoder : public Encoder } public: - std::unique_ptr encode(const LogicalTrackLayout& ltl, - const std::vector>& sectors, + std::unique_ptr encode(const LogicalTrackLayout* ltl, + const std::vector& sectors, const Image& image) override { IbmEncoderProto::TrackdataProto trackdata; - getEncoderTrackData(trackdata, ltl.logicalCylinder, ltl.logicalHead); + getEncoderTrackData(trackdata, ltl->logicalCylinder, ltl->logicalHead); auto writeBytes = [&](const Bytes& bytes) { @@ -148,7 +148,7 @@ class IbmEncoder : public Encoder uint8_t sectorSize = 0; { - int s = ltl.sectorSize >> 7; + int s = ltl->sectorSize >> 7; while (s > 1) { s >>= 1; @@ -233,7 +233,8 @@ class IbmEncoder : public Encoder } bw.write_8(damUnencoded); - Bytes truncatedData = sectorData->data.slice(0, ltl.sectorSize); + Bytes truncatedData = + sectorData->data.slice(0, ltl->sectorSize); bw += truncatedData; uint16_t crc = crc16(CCITT_POLY, data); bw.write_be16(crc); @@ -271,7 +272,7 @@ class IbmEncoder : public Encoder bool _lastBit; }; -std::unique_ptr createIbmEncoder(const EncoderProto& config) +Encoder* createIbmEncoder(const EncoderProto& config) { - return std::unique_ptr(new IbmEncoder(config)); + return new IbmEncoder(config); } diff --git a/arch/ibm/ibm.h b/arch/ibm/ibm.h index 60bf1eca..9a07d823 100644 --- a/arch/ibm/ibm.h +++ b/arch/ibm/ibm.h @@ -31,7 +31,7 @@ class Decoder; class DecoderProto; class EncoderProto; -extern std::unique_ptr createIbmDecoder(const DecoderProto& config); -extern std::unique_ptr createIbmEncoder(const EncoderProto& config); +extern Decoder* createIbmDecoder(const DecoderProto& config); +extern Encoder* createIbmEncoder(const EncoderProto& config); #endif diff --git a/arch/macintosh/decoder.cc b/arch/macintosh/decoder.cc index abb58618..ca8949c8 100644 --- a/arch/macintosh/decoder.cc +++ b/arch/macintosh/decoder.cc @@ -191,7 +191,7 @@ class MacintoshDecoder : public Decoder } }; -std::unique_ptr createMacintoshDecoder(const DecoderProto& config) +Decoder* createMacintoshDecoder(const DecoderProto& config) { - return std::unique_ptr(new MacintoshDecoder(config)); + return new MacintoshDecoder(config); } diff --git a/arch/macintosh/encoder.cc b/arch/macintosh/encoder.cc index c38b26a1..5a5cbffc 100644 --- a/arch/macintosh/encoder.cc +++ b/arch/macintosh/encoder.cc @@ -169,9 +169,8 @@ static uint8_t encode_side(uint8_t track, uint8_t side) return (side ? 0x20 : 0x00) | ((track > 0x3f) ? 0x01 : 0x00); } -static void write_sector(std::vector& bits, - unsigned& cursor, - const std::shared_ptr& sector) +static void write_sector( + std::vector& bits, unsigned& cursor, const Sector* sector) { if ((sector->data.size() != 512) && (sector->data.size() != 524)) error("unsupported sector size --- you must pick 512 or 524"); @@ -220,11 +219,11 @@ class MacintoshEncoder : public Encoder } public: - std::unique_ptr encode(const LogicalTrackLayout& ltl, - const std::vector>& sectors, + std::unique_ptr encode(const LogicalTrackLayout* ltl, + const std::vector& sectors, const Image& image) override { - double clockRateUs = clockRateUsForTrack(ltl.logicalCylinder); + double clockRateUs = clockRateUsForTrack(ltl->logicalCylinder); int bitsPerRevolution = 200000.0 / clockRateUs; std::vector bits(bitsPerRevolution); unsigned cursor = 0; @@ -252,7 +251,7 @@ class MacintoshEncoder : public Encoder const MacintoshEncoderProto& _config; }; -std::unique_ptr createMacintoshEncoder(const EncoderProto& config) +Encoder* createMacintoshEncoder(const EncoderProto& config) { - return std::unique_ptr(new MacintoshEncoder(config)); + return new MacintoshEncoder(config); } diff --git a/arch/macintosh/macintosh.h b/arch/macintosh/macintosh.h index 7da7467c..24f238fb 100644 --- a/arch/macintosh/macintosh.h +++ b/arch/macintosh/macintosh.h @@ -15,9 +15,7 @@ class Decoder; class DecoderProto; class EncoderProto; -extern std::unique_ptr createMacintoshDecoder( - const DecoderProto& config); -extern std::unique_ptr createMacintoshEncoder( - const EncoderProto& config); +extern Decoder* createMacintoshDecoder(const DecoderProto& config); +extern Encoder* createMacintoshEncoder(const EncoderProto& config); #endif diff --git a/arch/micropolis/decoder.cc b/arch/micropolis/decoder.cc index 6d202c4c..bc2f3030 100644 --- a/arch/micropolis/decoder.cc +++ b/arch/micropolis/decoder.cc @@ -290,7 +290,7 @@ class MicropolisDecoder : public Decoder _checksumType; /* -1 = auto, 1 = Micropolis, 2=MZOS */ }; -std::unique_ptr createMicropolisDecoder(const DecoderProto& config) +Decoder* createMicropolisDecoder(const DecoderProto& config) { - return std::unique_ptr(new MicropolisDecoder(config)); + return new MicropolisDecoder(config); } diff --git a/arch/micropolis/encoder.cc b/arch/micropolis/encoder.cc index b22f8c8b..8f2342ed 100644 --- a/arch/micropolis/encoder.cc +++ b/arch/micropolis/encoder.cc @@ -8,7 +8,7 @@ static void write_sector(std::vector& bits, unsigned& cursor, - const std::shared_ptr& sector, + const Sector* sector, MicropolisEncoderProto::EccType eccType) { if ((sector->data.size() != 256) && @@ -87,8 +87,8 @@ class MicropolisEncoder : public Encoder { } - std::unique_ptr encode(const LogicalTrackLayout& ltl, - const std::vector>& sectors, + std::unique_ptr encode(const LogicalTrackLayout* ltl, + const std::vector& sectors, const Image& image) override { int bitsPerRevolution = @@ -130,7 +130,7 @@ class MicropolisEncoder : public Encoder const MicropolisEncoderProto& _config; }; -std::unique_ptr createMicropolisEncoder(const EncoderProto& config) +Encoder* createMicropolisEncoder(const EncoderProto& config) { - return std::unique_ptr(new MicropolisEncoder(config)); + return new MicropolisEncoder(config); } diff --git a/arch/micropolis/micropolis.h b/arch/micropolis/micropolis.h index 2b2e5b8f..09b8a848 100644 --- a/arch/micropolis/micropolis.h +++ b/arch/micropolis/micropolis.h @@ -11,10 +11,8 @@ class Encoder; class EncoderProto; class DecoderProto; -extern std::unique_ptr createMicropolisDecoder( - const DecoderProto& config); -extern std::unique_ptr createMicropolisEncoder( - const EncoderProto& config); +extern Decoder* createMicropolisDecoder(const DecoderProto& config); +extern Encoder* createMicropolisEncoder(const EncoderProto& config); extern uint8_t micropolisChecksum(const Bytes& bytes); extern uint32_t vectorGraphicEcc(const Bytes& bytes); diff --git a/arch/mx/decoder.cc b/arch/mx/decoder.cc index 71b6e3c5..b042a7bd 100644 --- a/arch/mx/decoder.cc +++ b/arch/mx/decoder.cc @@ -79,7 +79,7 @@ class MxDecoder : public Decoder int _currentSector; }; -std::unique_ptr createMxDecoder(const DecoderProto& config) +Decoder* createMxDecoder(const DecoderProto& config) { - return std::unique_ptr(new MxDecoder(config)); + return new MxDecoder(config); } diff --git a/arch/mx/mx.h b/arch/mx/mx.h index b773ec98..721c1010 100644 --- a/arch/mx/mx.h +++ b/arch/mx/mx.h @@ -3,6 +3,6 @@ #include "lib/decoders/decoders.h" -extern std::unique_ptr createMxDecoder(const DecoderProto& config); +extern Decoder* createMxDecoder(const DecoderProto& config); #endif diff --git a/arch/northstar/decoder.cc b/arch/northstar/decoder.cc index 783698dd..5bff6786 100644 --- a/arch/northstar/decoder.cc +++ b/arch/northstar/decoder.cc @@ -182,7 +182,7 @@ class NorthstarDecoder : public Decoder uint8_t _hardSectorId; }; -std::unique_ptr createNorthstarDecoder(const DecoderProto& config) +Decoder* createNorthstarDecoder(const DecoderProto& config) { - return std::unique_ptr(new NorthstarDecoder(config)); + return new NorthstarDecoder(config); } diff --git a/arch/northstar/encoder.cc b/arch/northstar/encoder.cc index e1e69dda..f549a980 100644 --- a/arch/northstar/encoder.cc +++ b/arch/northstar/encoder.cc @@ -17,9 +17,8 @@ #define TOTAL_SECTOR_BYTES () -static void write_sector(std::vector& bits, - unsigned& cursor, - const std::shared_ptr& sector) +static void write_sector( + std::vector& bits, unsigned& cursor, const Sector* sector) { int preambleSize = 0; int encodedSectorSize = 0; @@ -129,8 +128,8 @@ class NorthstarEncoder : public Encoder { } - std::unique_ptr encode(const LogicalTrackLayout& ltl, - const std::vector>& sectors, + std::unique_ptr encode(const LogicalTrackLayout* ltl, + const std::vector& sectors, const Image& image) override { int bitsPerRevolution = 100000; @@ -162,7 +161,7 @@ class NorthstarEncoder : public Encoder const NorthstarEncoderProto& _config; }; -std::unique_ptr createNorthstarEncoder(const EncoderProto& config) +Encoder* createNorthstarEncoder(const EncoderProto& config) { - return std::unique_ptr(new NorthstarEncoder(config)); + return new NorthstarEncoder(config); } diff --git a/arch/northstar/northstar.h b/arch/northstar/northstar.h index 2b0335e3..8fcfce11 100644 --- a/arch/northstar/northstar.h +++ b/arch/northstar/northstar.h @@ -34,9 +34,7 @@ class DecoderProto; extern uint8_t northstarChecksum(const Bytes& bytes); -extern std::unique_ptr createNorthstarDecoder( - const DecoderProto& config); -extern std::unique_ptr createNorthstarEncoder( - const EncoderProto& config); +extern Decoder* createNorthstarDecoder(const DecoderProto& config); +extern Encoder* createNorthstarEncoder(const EncoderProto& config); #endif /* NORTHSTAR */ diff --git a/arch/rolandd20/decoder.cc b/arch/rolandd20/decoder.cc index 6908ec53..6a4ed394 100644 --- a/arch/rolandd20/decoder.cc +++ b/arch/rolandd20/decoder.cc @@ -46,7 +46,7 @@ class RolandD20Decoder : public Decoder } }; -std::unique_ptr createRolandD20Decoder(const DecoderProto& config) +Decoder* createRolandD20Decoder(const DecoderProto& config) { - return std::unique_ptr(new RolandD20Decoder(config)); + return new RolandD20Decoder(config); } diff --git a/arch/rolandd20/rolandd20.h b/arch/rolandd20/rolandd20.h index f8dcfb34..56a60343 100644 --- a/arch/rolandd20/rolandd20.h +++ b/arch/rolandd20/rolandd20.h @@ -1,4 +1,3 @@ #pragma once -extern std::unique_ptr createRolandD20Decoder( - const DecoderProto& config); +extern Decoder* createRolandD20Decoder(const DecoderProto& config); diff --git a/arch/smaky6/decoder.cc b/arch/smaky6/decoder.cc index ce307275..bd3ffe15 100644 --- a/arch/smaky6/decoder.cc +++ b/arch/smaky6/decoder.cc @@ -150,7 +150,7 @@ class Smaky6Decoder : public Decoder int _sectorIndex; }; -std::unique_ptr createSmaky6Decoder(const DecoderProto& config) +Decoder* createSmaky6Decoder(const DecoderProto& config) { - return std::unique_ptr(new Smaky6Decoder(config)); + return new Smaky6Decoder(config); } diff --git a/arch/smaky6/smaky6.h b/arch/smaky6/smaky6.h index b7b28919..c82f2833 100644 --- a/arch/smaky6/smaky6.h +++ b/arch/smaky6/smaky6.h @@ -4,6 +4,6 @@ #define SMAKY6_SECTOR_SIZE 256 #define SMAKY6_RECORD_SIZE (1 + SMAKY6_SECTOR_SIZE + 1) -extern std::unique_ptr createSmaky6Decoder(const DecoderProto& config); +extern Decoder* createSmaky6Decoder(const DecoderProto& config); #endif diff --git a/arch/tartu/decoder.cc b/arch/tartu/decoder.cc index 3d73e787..fa8be1bb 100644 --- a/arch/tartu/decoder.cc +++ b/arch/tartu/decoder.cc @@ -75,7 +75,7 @@ class TartuDecoder : public Decoder const TartuDecoderProto& _config; }; -std::unique_ptr createTartuDecoder(const DecoderProto& config) +Decoder* createTartuDecoder(const DecoderProto& config) { - return std::unique_ptr(new TartuDecoder(config)); + return new TartuDecoder(config); } diff --git a/arch/tartu/encoder.cc b/arch/tartu/encoder.cc index 14a9dbdb..390ceda5 100644 --- a/arch/tartu/encoder.cc +++ b/arch/tartu/encoder.cc @@ -17,8 +17,8 @@ class TartuEncoder : public Encoder { } - std::unique_ptr encode(const LogicalTrackLayout& ltl, - const std::vector>& sectors, + std::unique_ptr encode(const LogicalTrackLayout* ltl, + const std::vector& sectors, const Image& image) override { _clockRateUs = _config.clock_period_us(); @@ -76,7 +76,7 @@ class TartuEncoder : public Encoder writeRawBits(0b10, 2); }; - void writeSector(const std::shared_ptr& sectorData) + void writeSector(const Sector* sectorData) { writeRawBits(_config.header_marker(), 64); { @@ -109,7 +109,7 @@ class TartuEncoder : public Encoder bool _lastBit; }; -std::unique_ptr createTartuEncoder(const EncoderProto& config) +Encoder* createTartuEncoder(const EncoderProto& config) { - return std::unique_ptr(new TartuEncoder(config)); + return new TartuEncoder(config); } diff --git a/arch/tartu/tartu.h b/arch/tartu/tartu.h index d27600b1..5dbb9954 100644 --- a/arch/tartu/tartu.h +++ b/arch/tartu/tartu.h @@ -1,7 +1,7 @@ #ifndef TARTU_H #define TARTU_H -extern std::unique_ptr createTartuDecoder(const DecoderProto& config); -extern std::unique_ptr createTartuEncoder(const EncoderProto& config); +extern Decoder* createTartuDecoder(const DecoderProto& config); +extern Encoder* createTartuEncoder(const EncoderProto& config); #endif diff --git a/arch/tids990/decoder.cc b/arch/tids990/decoder.cc index a9b87945..a5e72ba3 100644 --- a/arch/tids990/decoder.cc +++ b/arch/tids990/decoder.cc @@ -95,7 +95,7 @@ class Tids990Decoder : public Decoder } }; -std::unique_ptr createTids990Decoder(const DecoderProto& config) +Decoder* createTids990Decoder(const DecoderProto& config) { - return std::unique_ptr(new Tids990Decoder(config)); + return new Tids990Decoder(config); } diff --git a/arch/tids990/encoder.cc b/arch/tids990/encoder.cc index 11b0a009..7da61d00 100644 --- a/arch/tids990/encoder.cc +++ b/arch/tids990/encoder.cc @@ -59,8 +59,8 @@ class Tids990Encoder : public Encoder } public: - std::unique_ptr encode(const LogicalTrackLayout& ltl, - const std::vector>& sectors, + std::unique_ptr encode(const LogicalTrackLayout* ltl, + const std::vector& sectors, const Image& image) override { double clockRateUs = _config.clock_period_us() / 2.0; @@ -144,7 +144,7 @@ class Tids990Encoder : public Encoder bool _lastBit; }; -std::unique_ptr createTids990Encoder(const EncoderProto& config) +Encoder* createTids990Encoder(const EncoderProto& config) { - return std::unique_ptr(new Tids990Encoder(config)); + return new Tids990Encoder(config); } diff --git a/arch/tids990/tids990.h b/arch/tids990/tids990.h index 43589115..cfc6d885 100644 --- a/arch/tids990/tids990.h +++ b/arch/tids990/tids990.h @@ -10,9 +10,7 @@ class Decoder; class DecoderProto; class EncoderProto; -extern std::unique_ptr createTids990Decoder( - const DecoderProto& config); -extern std::unique_ptr createTids990Encoder( - const EncoderProto& config); +extern Decoder* createTids990Decoder(const DecoderProto& config); +extern Encoder* createTids990Encoder(const EncoderProto& config); #endif diff --git a/arch/victor9k/decoder.cc b/arch/victor9k/decoder.cc index 63bc6c38..26cf7f88 100644 --- a/arch/victor9k/decoder.cc +++ b/arch/victor9k/decoder.cc @@ -113,7 +113,7 @@ class Victor9kDecoder : public Decoder } }; -std::unique_ptr createVictor9kDecoder(const DecoderProto& config) +Decoder* createVictor9kDecoder(const DecoderProto& config) { - return std::unique_ptr(new Victor9kDecoder(config)); + return new Victor9kDecoder(config); } diff --git a/arch/victor9k/encoder.cc b/arch/victor9k/encoder.cc index b9e64261..b4568cec 100644 --- a/arch/victor9k/encoder.cc +++ b/arch/victor9k/encoder.cc @@ -164,12 +164,12 @@ class Victor9kEncoder : public Encoder } public: - std::unique_ptr encode(const LogicalTrackLayout& ltl, - const std::vector>& sectors, + std::unique_ptr encode(const LogicalTrackLayout* ltl, + const std::vector& sectors, const Image& image) override { Victor9kEncoderProto::TrackdataProto trackdata; - getTrackFormat(trackdata, ltl.logicalCylinder, ltl.logicalHead); + getTrackFormat(trackdata, ltl->logicalCylinder, ltl->logicalHead); unsigned bitsPerRevolution = (trackdata.rotational_period_ms() * 1e3) / trackdata.clock_period_us(); @@ -201,9 +201,9 @@ class Victor9kEncoder : public Encoder const Victor9kEncoderProto& _config; }; -std::unique_ptr createVictor9kEncoder(const EncoderProto& config) +Encoder* createVictor9kEncoder(const EncoderProto& config) { - return std::unique_ptr(new Victor9kEncoder(config)); + return new Victor9kEncoder(config); } // vim: sw=4 ts=4 et diff --git a/arch/victor9k/victor9k.h b/arch/victor9k/victor9k.h index 548c1e9e..16b45127 100644 --- a/arch/victor9k/victor9k.h +++ b/arch/victor9k/victor9k.h @@ -18,9 +18,7 @@ class DecoderProto; #define VICTOR9K_SECTOR_LENGTH 512 -extern std::unique_ptr createVictor9kDecoder( - const DecoderProto& config); -extern std::unique_ptr createVictor9kEncoder( - const EncoderProto& config); +extern Decoder* createVictor9kDecoder(const DecoderProto& config); +extern Encoder* createVictor9kEncoder(const EncoderProto& config); #endif diff --git a/arch/zilogmcz/decoder.cc b/arch/zilogmcz/decoder.cc index 2e64f797..c4f0f25b 100644 --- a/arch/zilogmcz/decoder.cc +++ b/arch/zilogmcz/decoder.cc @@ -50,7 +50,7 @@ class ZilogMczDecoder : public Decoder } }; -std::unique_ptr createZilogMczDecoder(const DecoderProto& config) +Decoder* createZilogMczDecoder(const DecoderProto& config) { - return std::unique_ptr(new ZilogMczDecoder(config)); + return new ZilogMczDecoder(config); } diff --git a/arch/zilogmcz/zilogmcz.h b/arch/zilogmcz/zilogmcz.h index 45901849..8e3d1d52 100644 --- a/arch/zilogmcz/zilogmcz.h +++ b/arch/zilogmcz/zilogmcz.h @@ -1,7 +1,6 @@ #ifndef ZILOGMCZ_H #define ZILOGMCZ_H -extern std::unique_ptr createZilogMczDecoder( - const DecoderProto& config); +extern Decoder* createZilogMczDecoder(const DecoderProto& config); #endif diff --git a/build.py b/build.py index 44b5e5bb..fd0e235d 100644 --- a/build.py +++ b/build.py @@ -16,6 +16,7 @@ package(name="protobuf_lib", package="protobuf") package(name="z_lib", package="zlib") package(name="sqlite3_lib", package="sqlite3") +package(name="gc_lib", package="bdw-gc", ldflags=["-lgccpp"]) clibrary(name="protocol", hdrs={"protocol.h": "./protocol.h"}) diff --git a/build/pkg.py b/build/pkg.py index f948d7ae..e5c626a8 100644 --- a/build/pkg.py +++ b/build/pkg.py @@ -34,16 +34,16 @@ def get_property(self, name, flag): HostPkgConfig = _PkgConfig(G.HOST_PKG_CONFIG) -def _package(self, name, package, fallback, pkgconfig): +def _package( + self, name, package, fallback, extra_ldflags, extra_cflags, pkgconfig +): if pkgconfig.has_package(package): print(f"package '{package}' found") cflags = pkgconfig.get_property(package, "--cflags") ldflags = pkgconfig.get_property(package, "--libs") - if cflags: - self.args["caller_cflags"] = [cflags] - if ldflags: - self.args["caller_ldflags"] = [ldflags] + self.args["caller_cflags"] = extra_cflags + [cflags] + self.args["caller_ldflags"] = extra_ldflags + [ldflags] self.args["clibrary_deps"] = [self] self.args["cheader_deps"] = [self] self.traits.update({"clibrary", "cxxlibrary"}) @@ -70,13 +70,17 @@ def _package(self, name, package, fallback, pkgconfig): @Rule -def package(self, name, package=None, fallback: Target = None): - _package(self, name, package, fallback, TargetPkgConfig) +def package( + self, name, package=None, fallback: Target = None, ldflags=[], cflags=[] +): + _package(self, name, package, fallback, ldflags, cflags, TargetPkgConfig) @Rule -def hostpackage(self, name, package=None, fallback: Target = None): - _package(self, name, package, fallback, HostPkgConfig) +def hostpackage( + self, name, package=None, fallback: Target = None, ldflags=[], cflags=[] +): + _package(self, name, package, fallback, ldflags, cflags, HostPkgConfig) def has_package(name): diff --git a/lib/algorithms/readerwriter.cc b/lib/algorithms/readerwriter.cc index 453ba507..3ffb1599 100644 --- a/lib/algorithms/readerwriter.cc +++ b/lib/algorithms/readerwriter.cc @@ -36,15 +36,13 @@ enum BadSectorsState /* Log renderers. */ /* Start measuring the rotational speed */ -void renderLogMessage( - LogRenderer& r, std::shared_ptr m) +void renderLogMessage(LogRenderer& r, const BeginSpeedOperationLogMessage* m) { r.newline().add("Measuring rotational speed...").newline(); } /* Finish measuring the rotational speed */ -void renderLogMessage( - LogRenderer& r, std::shared_ptr m) +void renderLogMessage(LogRenderer& r, const EndSpeedOperationLogMessage* m) { r.newline() .add(fmt::format("Rotational period is {:.1f}ms ({:.1f}rpm)", @@ -54,37 +52,28 @@ void renderLogMessage( } /* Indicates that we're starting a write operation. */ -void renderLogMessage( - LogRenderer& r, std::shared_ptr m) +void renderLogMessage(LogRenderer& r, const BeginWriteOperationLogMessage* m) { r.header(fmt::format("W{:2}.{}: ", m->track, m->head)); } /* Indicates that we're finishing a write operation. */ -void renderLogMessage( - LogRenderer& r, std::shared_ptr m) -{ -} +void renderLogMessage(LogRenderer& r, const EndWriteOperationLogMessage* m) {} /* Indicates that we're starting a read operation. */ -void renderLogMessage( - LogRenderer& r, std::shared_ptr m) +void renderLogMessage(LogRenderer& r, const BeginReadOperationLogMessage* m) { r.header(fmt::format("R{:2}.{}: ", m->track, m->head)); } /* Indicates that we're finishing a read operation. */ -void renderLogMessage( - LogRenderer& r, std::shared_ptr m) -{ -} +void renderLogMessage(LogRenderer& r, const EndReadOperationLogMessage* m) {} /* We've just read a track (we might reread it if there are errors) */ -void renderLogMessage( - LogRenderer& r, std::shared_ptr m) +void renderLogMessage(LogRenderer& r, const TrackReadLogMessage* m) { - std::set> rawSectors; + std::set rawSectors; std::set> rawRecords; for (const auto& track : m->tracks) { @@ -109,8 +98,7 @@ void renderLogMessage( r.newline().add("sectors:"); - std::vector> sectors( - m->sectors.begin(), m->sectors.end()); + std::vector sectors(m->sectors.begin(), m->sectors.end()); std::sort(sectors.begin(), sectors.end(), sectorPointerSortPredicate); for (const auto& sector : rawSectors) @@ -134,28 +122,16 @@ void renderLogMessage( /* We've just read a disk. */ -void renderLogMessage( - LogRenderer& r, std::shared_ptr m) -{ -} +void renderLogMessage(LogRenderer& r, const DiskReadLogMessage* m) {} /* Large-scale operation start. */ -void renderLogMessage( - LogRenderer& r, std::shared_ptr m) -{ -} +void renderLogMessage(LogRenderer& r, const BeginOperationLogMessage* m) {} /* Large-scale operation end. */ -void renderLogMessage( - LogRenderer& r, std::shared_ptr m) -{ -} +void renderLogMessage(LogRenderer& r, const EndOperationLogMessage* m) {} /* Large-scale operation progress. */ -void renderLogMessage( - LogRenderer& r, std::shared_ptr m) -{ -} +void renderLogMessage(LogRenderer& r, const OperationProgressLogMessage* m) {} /* In order to allow rereads in file-based flux sources, we need to persist the * FluxSourceIterator (as that's where the state for which read to return is @@ -164,18 +140,18 @@ void renderLogMessage( class FluxSourceIteratorHolder { public: - FluxSourceIteratorHolder(FluxSource& fluxSource): _fluxSource(fluxSource) {} + FluxSourceIteratorHolder(FluxSource* fluxSource): _fluxSource(fluxSource) {} FluxSourceIterator& getIterator(unsigned physicalCylinder, unsigned head) { auto& it = _cache[std::make_pair(physicalCylinder, head)]; if (!it) - it = _fluxSource.readFlux(physicalCylinder, head); + it = _fluxSource->readFlux(physicalCylinder, head); return *it; } private: - FluxSource& _fluxSource; + FluxSource* _fluxSource; std::map, std::unique_ptr> _cache; }; @@ -230,12 +206,11 @@ static nanoseconds_t measureDiskRotation() /* Given a set of sectors, deduplicates them sensibly (e.g. if there is a good * and bad version of the same sector, the bad version is dropped). */ -static std::vector> collectSectors( - std::vector>& trackSectors, - bool collapse_conflicts = true) +static std::vector collectSectors( + std::vector& trackSectors, bool collapse_conflicts = true) { typedef std::tuple key_t; - std::multimap> sectors; + std::multimap sectors; for (const auto& sector : trackSectors) { @@ -245,7 +220,7 @@ static std::vector> collectSectors( sectors.insert({sectorid, sector}); } - std::set> sector_set; + std::set sector_set; auto it = sectors.begin(); while (it != sectors.end()) { @@ -253,7 +228,7 @@ static std::vector> collectSectors( auto new_sector = std::accumulate(it, ub, it->second, - [&](auto left, auto& rightit) -> std::shared_ptr + [&](auto left, auto& rightit) -> const Sector* { auto& right = rightit.second; if ((left->status == Sector::OK) && @@ -262,11 +237,11 @@ static std::vector> collectSectors( { if (!collapse_conflicts) { - auto s = std::make_shared(*right); + auto s = new Sector(*right); s->status = Sector::CONFLICT; sector_set.insert(s); } - auto s = std::make_shared(*left); + auto s = new Sector(*left); s->status = Sector::CONFLICT; return s; } @@ -290,16 +265,16 @@ static std::vector> collectSectors( struct CombinationResult { BadSectorsState result; - std::vector> sectors; + std::vector sectors; }; static CombinationResult combineRecordAndSectors( - std::vector>& tracks, - Decoder& decoder, - const std::shared_ptr& ltl) + std::vector& tracks, + Decoder* decoder, + const LogicalTrackLayout* ltl) { CombinationResult cr = {HAS_NO_BAD_SECTORS}; - std::vector> track_sectors; + std::vector track_sectors; /* Add the sectors which were there. */ @@ -311,7 +286,7 @@ static CombinationResult combineRecordAndSectors( for (unsigned sectorId : ltl->diskSectorOrder) { - auto sector = std::make_shared( + auto sector = new Sector( LogicalLocation{ltl->logicalCylinder, ltl->logicalHead, sectorId}); sector->status = Sector::MISSING; @@ -332,7 +307,7 @@ static CombinationResult combineRecordAndSectors( return cr; } -static void adjustTrackOnError(FluxSource& fluxSource, int baseTrack) +static void adjustTrackOnError(FluxSource* fluxSource, int baseTrack) { switch (globalConfig()->drive().error_behaviour()) { @@ -340,14 +315,14 @@ static void adjustTrackOnError(FluxSource& fluxSource, int baseTrack) break; case DriveProto::RECALIBRATE: - fluxSource.recalibrate(); + fluxSource->recalibrate(); break; case DriveProto::JIGGLE: if (baseTrack > 0) - fluxSource.seek(baseTrack - 1); + fluxSource->seek(baseTrack - 1); else - fluxSource.seek(baseTrack + 1); + fluxSource->seek(baseTrack + 1); break; } } @@ -355,14 +330,14 @@ static void adjustTrackOnError(FluxSource& fluxSource, int baseTrack) struct ReadGroupResult { ReadResult result; - std::vector> combinedSectors; + std::vector combinedSectors; }; static ReadGroupResult readGroup(const DiskLayout& diskLayout, FluxSourceIteratorHolder& fluxSourceIteratorHolder, - const std::shared_ptr& ltl, - std::vector>& tracks, - Decoder& decoder) + const LogicalTrackLayout* ltl, + std::vector& tracks, + Decoder* decoder) { ReadGroupResult rgr = {BAD_AND_CAN_NOT_RETRY}; @@ -404,7 +379,7 @@ static ReadGroupResult readGroup(const DiskLayout& diskLayout, (int)(fluxmap->duration() / 1e6), fluxmap->bytes()); - auto flux = decoder.decodeToSectors(std::move(fluxmap), ptl); + auto flux = decoder->decodeToSectors(std::move(fluxmap), ptl); flux->normalisedSectors = collectSectors(flux->allSectors); tracks.push_back(flux); @@ -432,19 +407,18 @@ static ReadGroupResult readGroup(const DiskLayout& diskLayout, void writeTracks(const DiskLayout& diskLayout, - FluxSinkFactory& fluxSinkFactory, - std::function( - const std::shared_ptr&)> producer, - std::function&)> - verifier, + FluxSinkFactory* fluxSinkFactory, + std::function(const LogicalTrackLayout*)> + producer, + std::function verifier, const std::vector& logicalLocations) { log(BeginOperationLogMessage{"Encoding and writing to disk"}); - if (fluxSinkFactory.isHardware()) + if (fluxSinkFactory->isHardware()) measureDiskRotation(); { - auto fluxSink = fluxSinkFactory.create(); + auto fluxSink = fluxSinkFactory->create(); int index = 0; for (auto& ch : logicalLocations) { @@ -509,18 +483,18 @@ void writeTracks(const DiskLayout& diskLayout, } void writeTracks(const DiskLayout& diskLayout, - FluxSinkFactory& fluxSinkFactory, - Encoder& encoder, + FluxSinkFactory* fluxSinkFactory, + Encoder* encoder, const Image& image, const std::vector& chs) { writeTracks( diskLayout, fluxSinkFactory, - [&](const std::shared_ptr& ltl) + [&](const LogicalTrackLayout* ltl) { - auto sectors = encoder.collectSectors(*ltl, image); - return encoder.encode(*ltl, sectors, image); + auto sectors = encoder->collectSectors(ltl, image); + return encoder->encode(ltl, sectors, image); }, [](const auto&) { @@ -530,25 +504,25 @@ void writeTracks(const DiskLayout& diskLayout, } void writeTracksAndVerify(const DiskLayout& diskLayout, - FluxSinkFactory& fluxSinkFactory, - Encoder& encoder, - FluxSource& fluxSource, - Decoder& decoder, + FluxSinkFactory* fluxSinkFactory, + Encoder* encoder, + FluxSource* fluxSource, + Decoder* decoder, const Image& image, const std::vector& chs) { writeTracks( diskLayout, fluxSinkFactory, - [&](const std::shared_ptr& ltl) + [&](const LogicalTrackLayout* ltl) { - auto sectors = encoder.collectSectors(*ltl, image); - return encoder.encode(*ltl, sectors, image); + auto sectors = encoder->collectSectors(ltl, image); + return encoder->encode(ltl, sectors, image); }, - [&](const std::shared_ptr& ltl) + [&](const LogicalTrackLayout* ltl) { FluxSourceIteratorHolder fluxSourceIteratorHolder(fluxSource); - std::vector> tracks; + std::vector tracks; auto [result, sectors] = readGroup( diskLayout, fluxSourceIteratorHolder, ltl, tracks, decoder); log(TrackReadLogMessage{tracks, sectors}); @@ -561,7 +535,7 @@ void writeTracksAndVerify(const DiskLayout& diskLayout, } Image wanted; - for (const auto& sector : encoder.collectSectors(*ltl, image)) + for (const auto& sector : encoder->collectSectors(ltl, image)) wanted .put(sector->logicalCylinder, sector->logicalHead, @@ -599,8 +573,8 @@ void writeTracksAndVerify(const DiskLayout& diskLayout, void writeDiskCommand(const DiskLayout& diskLayout, const Image& image, - Encoder& encoder, - FluxSinkFactory& fluxSinkFactory, + Encoder* encoder, + FluxSinkFactory* fluxSinkFactory, Decoder* decoder, FluxSource* fluxSource, const std::vector& physicalLocations) @@ -612,8 +586,8 @@ void writeDiskCommand(const DiskLayout& diskLayout, writeTracksAndVerify(diskLayout, fluxSinkFactory, encoder, - *fluxSource, - *decoder, + fluxSource, + decoder, image, chs); else @@ -622,8 +596,8 @@ void writeDiskCommand(const DiskLayout& diskLayout, void writeDiskCommand(const DiskLayout& diskLayout, const Image& image, - Encoder& encoder, - FluxSinkFactory& fluxSinkFactory, + Encoder* encoder, + FluxSinkFactory* fluxSinkFactory, Decoder* decoder, FluxSource* fluxSource) { @@ -639,16 +613,16 @@ void writeDiskCommand(const DiskLayout& diskLayout, } void writeRawDiskCommand(const DiskLayout& diskLayout, - FluxSource& fluxSource, - FluxSinkFactory& fluxSinkFactory) + FluxSource* fluxSource, + FluxSinkFactory* fluxSinkFactory) { writeTracks( diskLayout, fluxSinkFactory, - [&](const std::shared_ptr& ltl) + [&](const LogicalTrackLayout* ltl) { return fluxSource - .readFlux(ltl->physicalCylinder, ltl->physicalHead) + ->readFlux(ltl->physicalCylinder, ltl->physicalHead) ->next(); }, [](const auto&) @@ -659,13 +633,13 @@ void writeRawDiskCommand(const DiskLayout& diskLayout, } void readAndDecodeTrack(const DiskLayout& diskLayout, - FluxSource& fluxSource, - Decoder& decoder, - const std::shared_ptr& ltl, - std::vector>& tracks, - std::vector>& combinedSectors) + FluxSource* fluxSource, + Decoder* decoder, + const LogicalTrackLayout* ltl, + std::vector& tracks, + std::vector& combinedSectors) { - if (fluxSource.isHardware()) + if (fluxSource->isHardware()) measureDiskRotation(); FluxSourceIteratorHolder fluxSourceIteratorHolder(fluxSource); @@ -689,7 +663,7 @@ void readAndDecodeTrack(const DiskLayout& diskLayout, break; } - if (fluxSource.isHardware()) + if (fluxSource->isHardware()) { adjustTrackOnError(fluxSource, ltl->physicalCylinder); log("retrying; {} retries remaining", retriesRemaining); @@ -699,17 +673,16 @@ void readAndDecodeTrack(const DiskLayout& diskLayout, } void readDiskCommand(const DiskLayout& diskLayout, - FluxSource& fluxSource, - Decoder& decoder, + FluxSource* fluxSource, + Decoder* decoder, Disk& disk) { - std::unique_ptr outputFluxSinkFactory; + FluxSinkFactory* outputFluxSinkFactory; if (globalConfig()->decoder().has_copy_flux_to()) outputFluxSinkFactory = FluxSinkFactory::create(globalConfig()->decoder().copy_flux_to()); - std::map>> - tracksByLogicalLocation; + std::map> tracksByLogicalLocation; for (auto& [ch, track] : disk.tracksByPhysicalLocation) tracksByLogicalLocation[CylinderHead(track->ltl->logicalCylinder, track->ltl->logicalHead)] @@ -717,7 +690,7 @@ void readDiskCommand(const DiskLayout& diskLayout, log(BeginOperationLogMessage{"Reading and decoding disk"}); - if (fluxSource.isHardware()) + if (fluxSource->isHardware()) disk.rotationalPeriod = measureDiskRotation(); else disk.rotationalPeriod = getRotationalPeriodFromConfig(); @@ -737,7 +710,7 @@ void readDiskCommand(const DiskLayout& diskLayout, testForEmergencyStop(); auto& trackFluxes = tracksByLogicalLocation[logicalLocation]; - std::vector> trackSectors; + std::vector trackSectors; readAndDecodeTrack(diskLayout, fluxSource, decoder, @@ -829,11 +802,11 @@ void readDiskCommand(const DiskLayout& diskLayout, /* track can't be modified below this point. */ log(TrackReadLogMessage{trackFluxes, trackSectors}); - std::vector> all_sectors; + std::vector all_sectors; for (auto& [ch, sector] : disk.sectorsByPhysicalLocation) all_sectors.push_back(sector); all_sectors = collectSectors(all_sectors); - disk.image = std::make_shared(all_sectors); + disk.image = new Image(all_sectors); /* Log a _copy_ of the disk structure so that the logger * doesn't see the disk get mutated in subsequent reads. */ @@ -842,14 +815,14 @@ void readDiskCommand(const DiskLayout& diskLayout, } if (!disk.image) - disk.image = std::make_shared(); + disk.image = new Image(); log(EndOperationLogMessage{"Read complete"}); } void readDiskCommand(const DiskLayout& diskLayout, - FluxSource& fluxSource, - Decoder& decoder, + FluxSource* fluxSource, + Decoder* decoder, ImageWriter& writer) { Disk disk; diff --git a/lib/algorithms/readerwriter.h b/lib/algorithms/readerwriter.h index b3df203d..8f3e9308 100644 --- a/lib/algorithms/readerwriter.h +++ b/lib/algorithms/readerwriter.h @@ -30,8 +30,8 @@ struct EndSpeedOperationLogMessage struct TrackReadLogMessage { - std::vector> tracks; - std::vector> sectors; + std::vector tracks; + std::vector sectors; }; struct DiskReadLogMessage @@ -47,8 +47,8 @@ struct BeginReadOperationLogMessage struct EndReadOperationLogMessage { - std::shared_ptr trackDataFlux; - std::set> sectors; + const Track* trackDataFlux; + std::set sectors; }; struct BeginWriteOperationLogMessage @@ -77,55 +77,55 @@ struct OperationProgressLogMessage }; extern void writeTracks(const DiskLayout& diskLayout, - FluxSinkFactory& fluxSinkFactory, + FluxSinkFactory* fluxSinkFactory, const std::function( - const LogicalTrackLayout& ltl)> producer, + const LogicalTrackLayout* ltl)> producer, const std::vector& locations); extern void writeTracksAndVerify(const DiskLayout& diskLayout, - FluxSinkFactory& fluxSinkFactory, - Encoder& encoder, - FluxSource& fluxSource, - Decoder& decoder, + FluxSinkFactory* fluxSinkFactory, + Encoder* encoder, + FluxSource* fluxSource, + Decoder* decoder, const Image& image, const std::vector& locations); extern void writeDiskCommand(const DiskLayout& diskLayout, const Image& image, - Encoder& encoder, - FluxSinkFactory& fluxSinkFactory, + Encoder* encoder, + FluxSinkFactory* fluxSinkFactory, Decoder* decoder, FluxSource* fluxSource, const std::vector& locations); extern void writeDiskCommand(const DiskLayout& diskLayout, const Image& image, - Encoder& encoder, - FluxSinkFactory& fluxSinkFactory, + Encoder* encoder, + FluxSinkFactory* fluxSinkFactory, Decoder* decoder = nullptr, FluxSource* fluxSource = nullptr); extern void writeRawDiskCommand(const DiskLayout& diskLayout, - FluxSource& fluxSource, - FluxSinkFactory& fluxSinkFactory); + FluxSource* fluxSource, + FluxSinkFactory* fluxSinkFactory); /* Reads a single group of tracks. tracks and combinedSectors are populated. * tracks may contain preexisting data which will be taken into account. */ extern void readAndDecodeTrack(const DiskLayout& diskLayout, - FluxSource& fluxSource, - Decoder& decoder, - const std::shared_ptr& ltl, - std::vector>& tracks, - std::vector>& combinedSectors); + FluxSource* fluxSource, + Decoder* decoder, + const LogicalTrackLayout* ltl, + std::vector& tracks, + std::vector& combinedSectors); extern void readDiskCommand(const DiskLayout& diskLayout, - FluxSource& fluxSource, - Decoder& decoder, + FluxSource* fluxSource, + Decoder* decoder, Disk& disk); extern void readDiskCommand(const DiskLayout& diskLayout, - FluxSource& source, - Decoder& decoder, + FluxSource* source, + Decoder* decoder, ImageWriter& writer); #endif diff --git a/lib/config/config.cc b/lib/config/config.cc index e45e2ccb..ef2ad8dd 100644 --- a/lib/config/config.cc +++ b/lib/config/config.cc @@ -166,7 +166,7 @@ struct OptionLogMessage std::string message; }; -void renderLogMessage(LogRenderer& r, std::shared_ptr m) +void renderLogMessage(LogRenderer& r, const OptionLogMessage* m) { r.newline().add("OPTION:").add(m->message).newline(); } diff --git a/lib/core/globals.h b/lib/core/globals.h index 770e207a..8ef2147e 100644 --- a/lib/core/globals.h +++ b/lib/core/globals.h @@ -1,6 +1,7 @@ #ifndef GLOBALS_H #define GLOBALS_H +#include #include #include #include diff --git a/lib/core/logger.cc b/lib/core/logger.cc index eca1e751..3e05e570 100644 --- a/lib/core/logger.cc +++ b/lib/core/logger.cc @@ -4,53 +4,51 @@ static bool indented = false; -static std::function loggerImpl = +static std::function currentLoggerCb = [](const auto& message) { static auto r = LogRenderer::create(std::cout); r->add(message); }; -void log(const char* m) +void logImpl(const AnyLogMessage* message) { - log(std::string(m)); + currentLoggerCb(message); } -void log(const AnyLogMessage& message) +void log(const char* m) { - loggerImpl(message); + currentLoggerCb(new AnyLogMessage(new std::string(m))); } -void Logger::setLogger(std::function cb) +void Logger::setLogger(std::function cb) { - loggerImpl = cb; + currentLoggerCb = cb; } -void renderLogMessage( - LogRenderer& r, std::shared_ptr msg) +void renderLogMessage(LogRenderer& r, const ErrorLogMessage* msg) { r.newline().add("Error:").add(msg->message).newline(); } -void renderLogMessage( - LogRenderer& r, std::shared_ptr msg) +void renderLogMessage(LogRenderer& r, const EmergencyStopMessage* msg) { r.newline().add("Stop!").newline(); } -void renderLogMessage(LogRenderer& r, std::shared_ptr msg) +void renderLogMessage(LogRenderer& r, const std::string* msg) { r.newline().add(*msg).newline(); } -LogRenderer& LogRenderer::add(const AnyLogMessage& message) +LogRenderer& LogRenderer::add(const AnyLogMessage* message) { std::visit( - [&](const auto& arg) + [&](const auto* arg) { renderLogMessage(*this, arg); }, - message); + *message); return *this; } diff --git a/lib/core/logger.h b/lib/core/logger.h index cf89be10..ce018ea6 100644 --- a/lib/core/logger.h +++ b/lib/core/logger.h @@ -33,59 +33,52 @@ struct EmergencyStopMessage { }; +extern void renderLogMessage(LogRenderer& r, const ErrorLogMessage* m); +extern void renderLogMessage(LogRenderer& r, const EmergencyStopMessage* m); +extern void renderLogMessage(LogRenderer& r, const TrackReadLogMessage* m); +extern void renderLogMessage(LogRenderer& r, const DiskReadLogMessage* m); extern void renderLogMessage( - LogRenderer& r, std::shared_ptr m); + LogRenderer& r, const BeginSpeedOperationLogMessage* m); extern void renderLogMessage( - LogRenderer& r, std::shared_ptr m); + LogRenderer& r, const EndSpeedOperationLogMessage* m); extern void renderLogMessage( - LogRenderer& r, std::shared_ptr m); + LogRenderer& r, const BeginReadOperationLogMessage* m); extern void renderLogMessage( - LogRenderer& r, std::shared_ptr m); + LogRenderer& r, const EndReadOperationLogMessage* m); extern void renderLogMessage( - LogRenderer& r, std::shared_ptr m); + LogRenderer& r, const BeginWriteOperationLogMessage* m); extern void renderLogMessage( - LogRenderer& r, std::shared_ptr m); + LogRenderer& r, const EndWriteOperationLogMessage* m); +extern void renderLogMessage(LogRenderer& r, const BeginOperationLogMessage* m); +extern void renderLogMessage(LogRenderer& r, const EndOperationLogMessage* m); extern void renderLogMessage( - LogRenderer& r, std::shared_ptr m); -extern void renderLogMessage( - LogRenderer& r, std::shared_ptr m); -extern void renderLogMessage( - LogRenderer& r, std::shared_ptr m); -extern void renderLogMessage( - LogRenderer& r, std::shared_ptr m); -extern void renderLogMessage( - LogRenderer& r, std::shared_ptr m); -extern void renderLogMessage( - LogRenderer& r, std::shared_ptr m); -extern void renderLogMessage( - LogRenderer& r, std::shared_ptr m); -extern void renderLogMessage( - LogRenderer& r, std::shared_ptr m); + LogRenderer& r, const OperationProgressLogMessage* m); +extern void renderLogMessage(LogRenderer& r, const OptionLogMessage* m); -typedef std::variant, - std::shared_ptr, - std::shared_ptr, - std::shared_ptr, - std::shared_ptr, - std::shared_ptr, - std::shared_ptr, - std::shared_ptr, - std::shared_ptr, - std::shared_ptr, - std::shared_ptr, - std::shared_ptr, - std::shared_ptr, - std::shared_ptr, - std::shared_ptr> +typedef std::variant AnyLogMessage; extern void log(const char* ptr); -extern void log(const AnyLogMessage& message); +extern void logImpl(const AnyLogMessage* message); template inline void log(const T& message) { - log(AnyLogMessage(std::make_shared(message))); + logImpl(new AnyLogMessage(new T(message))); } template @@ -101,7 +94,7 @@ class LogRenderer virtual ~LogRenderer() {} public: - LogRenderer& add(const AnyLogMessage& message); + LogRenderer& add(const AnyLogMessage* message); public: virtual LogRenderer& add(const std::string& m) = 0; @@ -112,7 +105,7 @@ class LogRenderer namespace Logger { - extern void setLogger(std::function cb); + extern void setLogger(std::function cb); } #endif diff --git a/lib/data/disk.cc b/lib/data/disk.cc index ed19e3d3..a354c603 100644 --- a/lib/data/disk.cc +++ b/lib/data/disk.cc @@ -19,14 +19,11 @@ namespace inline constexpr pair_to_range_t pair_to_range{}; } -Disk::Disk(): image(std::make_shared()) {} +Disk::Disk(): image(nullptr) {} -Disk::Disk( - const std::shared_ptr& image, const DiskLayout& diskLayout): - image(image) +Disk::Disk(const Image* image, const DiskLayout& diskLayout): image(image) { - std::multimap> - sectorsGroupedByTrack; + std::multimap sectorsGroupedByTrack; for (const auto& sector : *image) sectorsGroupedByTrack.insert( std::make_pair(sector->physicalLocation.value(), sector)); @@ -39,7 +36,7 @@ Disk::Disk( diskLayout.layoutByPhysicalLocation.at(physicalLocation); const auto& ltl = ptl->logicalTrackLayout; - auto decodedTrack = std::make_shared(); + auto decodedTrack = new Track(); decodedTrack->ltl = ltl; decodedTrack->ptl = ptl; tracksByPhysicalLocation.insert( diff --git a/lib/data/disk.h b/lib/data/disk.h index ba3c12c4..83607f1c 100644 --- a/lib/data/disk.h +++ b/lib/data/disk.h @@ -22,18 +22,18 @@ struct Record struct Track { - std::shared_ptr ltl; - std::shared_ptr ptl; + const LogicalTrackLayout* ltl; + const PhysicalTrackLayout* ptl; std::shared_ptr fluxmap; std::vector> records; - + /* All sectors, valid or not, including duplicates. */ - std::vector> allSectors; + std::vector allSectors; /* Zero or one sector for each ID, preferring good ones. */ - std::vector> normalisedSectors; + std::vector normalisedSectors; }; struct Disk @@ -43,16 +43,13 @@ struct Disk /* Creates a Disk from an Image, populating the tracks and sectors maps * based on the supplied disk layout. */ - Disk(const std::shared_ptr& image, - const DiskLayout& diskLayout); + Disk(const Image* image, const DiskLayout& diskLayout); Disk& operator=(const Disk& other) = default; - std::multimap> - tracksByPhysicalLocation; - std::multimap> - sectorsByPhysicalLocation; - std::shared_ptr image; + std::multimap tracksByPhysicalLocation; + std::multimap sectorsByPhysicalLocation; + const Image* image; /* 0 if the period is unknown (e.g. if this Disk was made from an image). */ diff --git a/lib/data/fluxmap.h b/lib/data/fluxmap.h index 3b1ee633..be60e4f7 100644 --- a/lib/data/fluxmap.h +++ b/lib/data/fluxmap.h @@ -8,7 +8,7 @@ class RawBits; -class Fluxmap +class Fluxmap: public gc { public: struct Position diff --git a/lib/data/fluxpattern.h b/lib/data/fluxpattern.h index 3ca2a992..04c6f851 100644 --- a/lib/data/fluxpattern.h +++ b/lib/data/fluxpattern.h @@ -8,7 +8,7 @@ class FluxMatcher; class DecoderProto; -struct FluxMatch +struct FluxMatch: public gc { const FluxMatcher* matcher; unsigned intervals; @@ -16,7 +16,7 @@ struct FluxMatch unsigned zeroes; }; -class FluxMatcher +class FluxMatcher: public gc { public: virtual ~FluxMatcher() {} diff --git a/lib/data/image.cc b/lib/data/image.cc index bff0bd4b..fd7c998f 100644 --- a/lib/data/image.cc +++ b/lib/data/image.cc @@ -6,7 +6,7 @@ Image::Image() {} -Image::Image(const std::vector>& sectors) +Image::Image(const std::vector& sectors) { for (auto& sector : sectors) _sectors[{sector->logicalCylinder, @@ -32,7 +32,7 @@ bool Image::contains(const LogicalLocation& location) const return _sectors.find(location) != _sectors.end(); } -std::shared_ptr Image::get(const LogicalLocation& location) const +const Sector* Image::get(const LogicalLocation& location) const { auto i = _sectors.find(location); if (i == _sectors.end()) @@ -40,9 +40,9 @@ std::shared_ptr Image::get(const LogicalLocation& location) const return i->second; } -std::shared_ptr Image::put(const LogicalLocation& location) +Sector* Image::put(const LogicalLocation& location) { - auto sector = std::make_shared(location); + auto sector = new Sector(location); _sectors[location] = sector; return sector; } @@ -59,7 +59,7 @@ void Image::addMissingSectors(const DiskLayout& diskLayout, bool populated) { auto& ltl = diskLayout.layoutByLogicalLocation.at( {location.logicalCylinder, location.logicalHead}); - auto sector = std::make_shared(location); + auto sector = new Sector(location); if (populated) sector->data = Bytes(ltl->sectorSize); diff --git a/lib/data/image.h b/lib/data/image.h index 6ca02651..ba0dac18 100644 --- a/lib/data/image.h +++ b/lib/data/image.h @@ -17,21 +17,21 @@ struct Geometry unsigned totalBytes = 0; }; -class Image +class Image : public gc { public: Image(); - Image(const std::vector>& sectors); + Image(const std::vector& sectors); public: class const_iterator { - typedef std::map>::const_iterator wrapped_iterator_t; + typedef std::map::const_iterator + wrapped_iterator_t; public: const_iterator(const wrapped_iterator_t& it): _it(it) {} - std::shared_ptr operator*() + const Sector* operator*() { return _it->second; } @@ -63,8 +63,8 @@ class Image bool empty() const; bool contains(const LogicalLocation& location) const; - std::shared_ptr get(const LogicalLocation& location) const; - std::shared_ptr put(const LogicalLocation& location); + const Sector* get(const LogicalLocation& location) const; + Sector* put(const LogicalLocation& location); void erase(const LogicalLocation& location); bool contains(const CylinderHead& ch, unsigned sector) const @@ -77,25 +77,22 @@ class Image return contains({cylinder, head, sector}); } - std::shared_ptr get( - const CylinderHead& ch, unsigned sector) const + const Sector* get(const CylinderHead& ch, unsigned sector) const { return get({ch.cylinder, ch.head, sector}); } - std::shared_ptr get( - unsigned cylinder, unsigned head, unsigned sector) const + const Sector* get(unsigned cylinder, unsigned head, unsigned sector) const { return get({cylinder, head, sector}); } - std::shared_ptr put(const CylinderHead& ch, unsigned sector) + Sector* put(const CylinderHead& ch, unsigned sector) { return put({ch.cylinder, ch.head, sector}); } - std::shared_ptr put( - unsigned cylinder, unsigned head, unsigned sector) + Sector* put(unsigned cylinder, unsigned head, unsigned sector) { return put({cylinder, head, sector}); } @@ -129,7 +126,7 @@ class Image private: Geometry _geometry = {0, 0, 0}; - std::map> _sectors; + std::map _sectors; }; #endif diff --git a/lib/data/layout.cc b/lib/data/layout.cc index 4129bf00..d825b45e 100644 --- a/lib/data/layout.cc +++ b/lib/data/layout.cc @@ -192,7 +192,7 @@ DiskLayout::DiskLayout(const ConfigProto& config) for (unsigned logicalHead = 0; logicalHead < numLogicalHeads; logicalHead++) { - auto ltl = std::make_shared(); + auto ltl = new LogicalTrackLayout(); CylinderHead ch(logicalCylinder, logicalHead); layoutByLogicalLocation[ch] = ltl; logicalLocations.push_back(ch); @@ -248,7 +248,7 @@ DiskLayout::DiskLayout(const ConfigProto& config) physicalHead <= maxPhysicalHead; physicalHead++) { - auto ptl = std::make_shared(); + auto ptl = new PhysicalTrackLayout(); CylinderHead ch(physicalCylinder, physicalHead); layoutByPhysicalLocation[ch] = ptl; physicalLocations.push_back(ch); diff --git a/lib/data/layout.h b/lib/data/layout.h index f4d587b2..4164f3cf 100644 --- a/lib/data/layout.h +++ b/lib/data/layout.h @@ -62,7 +62,7 @@ struct PhysicalTrackLayout unsigned groupOffset; /* The logical track that this track is part of. */ - std::shared_ptr logicalTrackLayout; + const LogicalTrackLayout* logicalTrackLayout; }; class DiskLayout @@ -95,10 +95,8 @@ class DiskLayout /* Physical and logical layouts by location. */ - std::map> - layoutByPhysicalLocation; - std::map> - layoutByLogicalLocation; + std::map layoutByPhysicalLocation; + std::map layoutByLogicalLocation; /* Ordered lists of physical and logical locations. */ @@ -170,10 +168,9 @@ class DiskLayout LayoutBounds getLogicalBounds() const; }; -static std::shared_ptr createDiskLayout( - const ConfigProto& config = globalConfig()) +static DiskLayout* createDiskLayout(const ConfigProto& config = globalConfig()) { - return std::make_shared(config); + return new DiskLayout(config); } class TrackInfo diff --git a/lib/data/sector.cc b/lib/data/sector.cc index cefe78eb..4f259430 100644 --- a/lib/data/sector.cc +++ b/lib/data/sector.cc @@ -58,14 +58,12 @@ Sector::Status Sector::stringToStatus(const std::string& value) return Status::INTERNAL_ERROR; } -bool sectorPointerSortPredicate(const std::shared_ptr& lhs, - const std::shared_ptr& rhs) +bool sectorPointerSortPredicate(const Sector* lhs, const Sector* rhs) { return *lhs < *rhs; } -bool sectorPointerEqualsPredicate(const std::shared_ptr& lhs, - const std::shared_ptr& rhs) +bool sectorPointerEqualsPredicate(const Sector* lhs, const Sector* rhs) { if (!lhs && !rhs) return true; diff --git a/lib/data/sector.h b/lib/data/sector.h index d198ff9a..a8515e90 100644 --- a/lib/data/sector.h +++ b/lib/data/sector.h @@ -8,7 +8,7 @@ class Record; class LogicalTrackLayout; -struct Sector : public LogicalLocation +struct Sector : public LogicalLocation, public gc { enum Status { @@ -61,10 +61,6 @@ struct fmt::formatter : formatter } }; -extern bool sectorPointerSortPredicate(const std::shared_ptr& lhs, - const std::shared_ptr& rhs); -extern bool sectorPointerEqualsPredicate( - const std::shared_ptr& lhs, - const std::shared_ptr& rhs); +extern bool sectorPointerSortPredicate(const Sector* lhs, const Sector* rhs); #endif diff --git a/lib/decoders/decoders.cc b/lib/decoders/decoders.cc index 443b9658..c9e90a05 100644 --- a/lib/decoders/decoders.cc +++ b/lib/decoders/decoders.cc @@ -13,13 +13,12 @@ #include "lib/data/layout.h" #include -std::shared_ptr Decoder::decodeToSectors( - std::shared_ptr fluxmap, - const std::shared_ptr& ptl) +Track* Decoder::decodeToSectors( + std::shared_ptr fluxmap, const PhysicalTrackLayout* ptl) { _ltl = ptl->logicalTrackLayout; - _trackdata = std::make_shared(); + _trackdata = new Track(); _trackdata->fluxmap = fluxmap; _trackdata->ptl = ptl; _trackdata->ltl = ptl->logicalTrackLayout; @@ -29,7 +28,7 @@ std::shared_ptr Decoder::decodeToSectors( auto newSector = [&] { - _sector = std::make_shared(LogicalLocation{0, 0, 0}); + _sector = new Sector(LogicalLocation{0, 0, 0}); _sector->physicalLocation = std::make_optional( ptl->physicalCylinder, ptl->physicalHead); _sector->status = Sector::MISSING; diff --git a/lib/decoders/decoders.h b/lib/decoders/decoders.h index 83ef883b..23ed6b8a 100644 --- a/lib/decoders/decoders.h +++ b/lib/decoders/decoders.h @@ -41,8 +41,8 @@ class Decoder virtual ~Decoder() {} - static std::unique_ptr create(Config& config); - static std::unique_ptr create(const DecoderProto& config); + static Decoder* create(Config& config); + static Decoder* create(const DecoderProto& config); public: enum RecordType @@ -53,9 +53,8 @@ class Decoder }; public: - std::shared_ptr decodeToSectors( - std::shared_ptr fluxmap, - const std::shared_ptr& ptl); + Track* decodeToSectors( + std::shared_ptr fluxmap, const PhysicalTrackLayout* ptl); void pushRecord( const Fluxmap::Position& start, const Fluxmap::Position& end); @@ -105,9 +104,9 @@ class Decoder virtual void decodeDataRecord() {}; const DecoderProto& _config; - std::shared_ptr _ltl; - std::shared_ptr _trackdata; - std::shared_ptr _sector; + const LogicalTrackLayout* _ltl; + Track* _trackdata; + Sector* _sector; std::unique_ptr _decoder; std::vector _recordBits; diff --git a/lib/encoders/encoders.cc b/lib/encoders/encoders.cc index 1189eeae..cb1e0a05 100644 --- a/lib/encoders/encoders.cc +++ b/lib/encoders/encoders.cc @@ -23,25 +23,25 @@ nanoseconds_t Encoder::calculatePhysicalClockPeriod( (currentRotationalPeriod / targetRotationalPeriod); } -std::shared_ptr Encoder::getSector( +const Sector* Encoder::getSector( const CylinderHead& ch, const Image& image, unsigned sectorId) { return image.get(ch.cylinder, ch.head, sectorId); } -std::vector> Encoder::collectSectors( - const LogicalTrackLayout& ltl, const Image& image) +std::vector Encoder::collectSectors( + const LogicalTrackLayout* ltl, const Image& image) { - std::vector> sectors; + std::vector sectors; - for (unsigned sectorId : ltl.diskSectorOrder) + for (unsigned sectorId : ltl->diskSectorOrder) { - const auto& sector = - getSector({ltl.logicalCylinder, ltl.logicalHead}, image, sectorId); + const auto& sector = getSector( + {ltl->logicalCylinder, ltl->logicalHead}, image, sectorId); if (!sector) error("sector {}.{}.{} is missing from the image", - ltl.logicalCylinder, - ltl.logicalHead, + ltl->logicalCylinder, + ltl->logicalHead, sectorId); sectors.push_back(sector); } diff --git a/lib/encoders/encoders.h b/lib/encoders/encoders.h index 1456951a..0586bd5f 100644 --- a/lib/encoders/encoders.h +++ b/lib/encoders/encoders.h @@ -16,17 +16,17 @@ class Encoder Encoder(const EncoderProto& config) {} virtual ~Encoder() {} - static std::unique_ptr create(Config& config); + static Encoder* create(Config& config); public: - virtual std::shared_ptr getSector( + virtual const Sector* getSector( const CylinderHead& ch, const Image& image, unsigned sectorId); - virtual std::vector> collectSectors( - const LogicalTrackLayout& ltl, const Image& image); + virtual std::vector collectSectors( + const LogicalTrackLayout* ltl, const Image& image); - virtual std::unique_ptr encode(const LogicalTrackLayout& ltl, - const std::vector>& sectors, + virtual std::unique_ptr encode(const LogicalTrackLayout* ltl, + const std::vector& sectors, const Image& image) = 0; nanoseconds_t calculatePhysicalClockPeriod( diff --git a/lib/fluxsink/a2rfluxsink.cc b/lib/fluxsink/a2rfluxsink.cc index 6ba23316..04f56ae4 100644 --- a/lib/fluxsink/a2rfluxsink.cc +++ b/lib/fluxsink/a2rfluxsink.cc @@ -255,8 +255,8 @@ class A2RFluxSinkFactory : public FluxSinkFactory const A2RFluxSinkProto& _config; }; -std::unique_ptr FluxSinkFactory::createA2RFluxSinkFactory( +FluxSinkFactory* FluxSinkFactory::createA2RFluxSinkFactory( const A2RFluxSinkProto& config) { - return std::unique_ptr(new A2RFluxSinkFactory(config)); + return new A2RFluxSinkFactory(config); } diff --git a/lib/fluxsink/aufluxsink.cc b/lib/fluxsink/aufluxsink.cc index a1de540b..9212050f 100644 --- a/lib/fluxsink/aufluxsink.cc +++ b/lib/fluxsink/aufluxsink.cc @@ -114,8 +114,8 @@ class AuFluxSinkFactory : public FluxSinkFactory const AuFluxSinkProto& _config; }; -std::unique_ptr FluxSinkFactory::createAuFluxSinkFactory( +FluxSinkFactory* FluxSinkFactory::createAuFluxSinkFactory( const AuFluxSinkProto& config) { - return std::unique_ptr(new AuFluxSinkFactory(config)); + return new AuFluxSinkFactory(config); } diff --git a/lib/fluxsink/fl2fluxsink.cc b/lib/fluxsink/fl2fluxsink.cc index 4c9d90d0..098948a7 100644 --- a/lib/fluxsink/fl2fluxsink.cc +++ b/lib/fluxsink/fl2fluxsink.cc @@ -85,15 +85,14 @@ class Fl2FluxSinkFactory : public FluxSinkFactory const std::string _filename; }; -std::unique_ptr FluxSinkFactory::createFl2FluxSinkFactory( +FluxSinkFactory* FluxSinkFactory::createFl2FluxSinkFactory( const Fl2FluxSinkProto& config) { - return std::unique_ptr( - new Fl2FluxSinkFactory(config.filename())); + return new Fl2FluxSinkFactory(config.filename()); } -std::unique_ptr FluxSinkFactory::createFl2FluxSinkFactory( +FluxSinkFactory* FluxSinkFactory::createFl2FluxSinkFactory( const std::string& filename) { - return std::unique_ptr(new Fl2FluxSinkFactory(filename)); + return new Fl2FluxSinkFactory(filename); } diff --git a/lib/fluxsink/fluxsink.cc b/lib/fluxsink/fluxsink.cc index 250f3a1c..afc618b2 100644 --- a/lib/fluxsink/fluxsink.cc +++ b/lib/fluxsink/fluxsink.cc @@ -7,15 +7,14 @@ #include "lib/core/utils.h" #include -std::unique_ptr FluxSinkFactory::create(Config& config) +FluxSinkFactory* FluxSinkFactory::create(Config& config) { if (!config.hasFluxSink()) error("no flux sink configured"); return create(config->flux_sink()); } -std::unique_ptr FluxSinkFactory::create( - const FluxSinkProto& config) +FluxSinkFactory* FluxSinkFactory::create(const FluxSinkProto& config) { switch (config.type()) { @@ -38,6 +37,6 @@ std::unique_ptr FluxSinkFactory::create( return createFl2FluxSinkFactory(config.fl2()); default: - return std::unique_ptr(); + return nullptr; } } diff --git a/lib/fluxsink/fluxsink.h b/lib/fluxsink/fluxsink.h index c43dd1d3..9c8f00de 100644 --- a/lib/fluxsink/fluxsink.h +++ b/lib/fluxsink/fluxsink.h @@ -33,29 +33,29 @@ class FluxSink } }; -class FluxSinkFactory +class FluxSinkFactory : public gc { public: virtual ~FluxSinkFactory() {} - static std::unique_ptr createHardwareFluxSinkFactory( + static FluxSinkFactory* createHardwareFluxSinkFactory( const HardwareFluxSinkProto& config); - static std::unique_ptr createAuFluxSinkFactory( + static FluxSinkFactory* createAuFluxSinkFactory( const AuFluxSinkProto& config); - static std::unique_ptr createA2RFluxSinkFactory( + static FluxSinkFactory* createA2RFluxSinkFactory( const A2RFluxSinkProto& config); - static std::unique_ptr createVcdFluxSinkFactory( + static FluxSinkFactory* createVcdFluxSinkFactory( const VcdFluxSinkProto& config); - static std::unique_ptr createScpFluxSinkFactory( + static FluxSinkFactory* createScpFluxSinkFactory( const ScpFluxSinkProto& config); - static std::unique_ptr createFl2FluxSinkFactory( + static FluxSinkFactory* createFl2FluxSinkFactory( const Fl2FluxSinkProto& config); - static std::unique_ptr createFl2FluxSinkFactory( + static FluxSinkFactory* createFl2FluxSinkFactory( const std::string& filename); - static std::unique_ptr create(Config& config); - static std::unique_ptr create(const FluxSinkProto& config); + static FluxSinkFactory* create(Config& config); + static FluxSinkFactory* create(const FluxSinkProto& config); public: /* Creates a writer object. */ @@ -81,9 +81,9 @@ class FluxSinkFactory }; inline std::ostream& operator<<( - std::ostream& stream, FluxSinkFactory& flushSink) + std::ostream& stream, FluxSinkFactory* flushSink) { - stream << (std::string)flushSink; + stream << (std::string)*flushSink; return stream; } diff --git a/lib/fluxsink/hardwarefluxsink.cc b/lib/fluxsink/hardwarefluxsink.cc index 0a12746a..49c73eae 100644 --- a/lib/fluxsink/hardwarefluxsink.cc +++ b/lib/fluxsink/hardwarefluxsink.cc @@ -40,8 +40,8 @@ class HardwareFluxSinkFactory : public FluxSinkFactory } }; -std::unique_ptr FluxSinkFactory::createHardwareFluxSinkFactory( +FluxSinkFactory* FluxSinkFactory::createHardwareFluxSinkFactory( const HardwareFluxSinkProto& config) { - return std::make_unique(); + return nullptr; } diff --git a/lib/fluxsink/scpfluxsink.cc b/lib/fluxsink/scpfluxsink.cc index 808a4e66..76bb442a 100644 --- a/lib/fluxsink/scpfluxsink.cc +++ b/lib/fluxsink/scpfluxsink.cc @@ -219,8 +219,8 @@ class ScpFluxSinkFactory : public FluxSinkFactory const ScpFluxSinkProto& _config; }; -std::unique_ptr FluxSinkFactory::createScpFluxSinkFactory( +FluxSinkFactory* FluxSinkFactory::createScpFluxSinkFactory( const ScpFluxSinkProto& config) { - return std::unique_ptr(new ScpFluxSinkFactory(config)); + return new ScpFluxSinkFactory(config); } diff --git a/lib/fluxsink/vcdfluxsink.cc b/lib/fluxsink/vcdfluxsink.cc index 3eabd294..e8915ba8 100644 --- a/lib/fluxsink/vcdfluxsink.cc +++ b/lib/fluxsink/vcdfluxsink.cc @@ -91,8 +91,8 @@ class VcdFluxSinkFactory : public FluxSinkFactory const VcdFluxSinkProto& _config; }; -std::unique_ptr FluxSinkFactory::createVcdFluxSinkFactory( +FluxSinkFactory* FluxSinkFactory::createVcdFluxSinkFactory( const VcdFluxSinkProto& config) { - return std::unique_ptr(new VcdFluxSinkFactory(config)); + return new VcdFluxSinkFactory(config); } diff --git a/lib/fluxsource/a2rfluxsource.cc b/lib/fluxsource/a2rfluxsource.cc index 3f511709..327d48c9 100644 --- a/lib/fluxsource/a2rfluxsource.cc +++ b/lib/fluxsource/a2rfluxsource.cc @@ -196,8 +196,7 @@ class A2rFluxSource : public FluxSource std::map> _v2data; }; -std::unique_ptr FluxSource::createA2rFluxSource( - const A2rFluxSourceProto& config) +FluxSource* FluxSource::createA2rFluxSource(const A2rFluxSourceProto& config) { - return std::unique_ptr(new A2rFluxSource(config)); + return new A2rFluxSource(config); } diff --git a/lib/fluxsource/cwffluxsource.cc b/lib/fluxsource/cwffluxsource.cc index 83696631..6fea33be 100644 --- a/lib/fluxsource/cwffluxsource.cc +++ b/lib/fluxsource/cwffluxsource.cc @@ -129,8 +129,7 @@ class CwfFluxSource : public TrivialFluxSource std::map> _trackOffsets; }; -std::unique_ptr FluxSource::createCwfFluxSource( - const CwfFluxSourceProto& config) +FluxSource* FluxSource::createCwfFluxSource(const CwfFluxSourceProto& config) { - return std::unique_ptr(new CwfFluxSource(config)); + return new CwfFluxSource(config); } diff --git a/lib/fluxsource/dmkfluxsource.cc b/lib/fluxsource/dmkfluxsource.cc index 027f12b2..2af4b84d 100644 --- a/lib/fluxsource/dmkfluxsource.cc +++ b/lib/fluxsource/dmkfluxsource.cc @@ -85,8 +85,7 @@ class DmkFluxSource : public FluxSource const std::string _path; }; -std::unique_ptr FluxSource::createDmkFluxSource( - const DmkFluxSourceProto& config) +FluxSource* FluxSource::createDmkFluxSource(const DmkFluxSourceProto& config) { - return std::unique_ptr(new DmkFluxSource(config)); + return new DmkFluxSource(config); } diff --git a/lib/fluxsource/erasefluxsource.cc b/lib/fluxsource/erasefluxsource.cc index 3146758a..07f5de86 100644 --- a/lib/fluxsource/erasefluxsource.cc +++ b/lib/fluxsource/erasefluxsource.cc @@ -22,8 +22,8 @@ class EraseFluxSource : public TrivialFluxSource void recalibrate() override {} }; -std::unique_ptr FluxSource::createEraseFluxSource( +FluxSource* FluxSource::createEraseFluxSource( const EraseFluxSourceProto& config) { - return std::make_unique(config); + return new EraseFluxSource(config); } diff --git a/lib/fluxsource/fl2fluxsource.cc b/lib/fluxsource/fl2fluxsource.cc index 5f2c37d1..425cfa5d 100644 --- a/lib/fluxsource/fl2fluxsource.cc +++ b/lib/fluxsource/fl2fluxsource.cc @@ -79,8 +79,7 @@ class Fl2FluxSource : public FluxSource FluxFileProto _proto; }; -std::unique_ptr FluxSource::createFl2FluxSource( - const Fl2FluxSourceProto& config) +FluxSource* FluxSource::createFl2FluxSource(const Fl2FluxSourceProto& config) { - return std::unique_ptr(new Fl2FluxSource(config)); + return new Fl2FluxSource(config); } diff --git a/lib/fluxsource/fluxsource.cc b/lib/fluxsource/fluxsource.cc index 67a253c4..1c760178 100644 --- a/lib/fluxsource/fluxsource.cc +++ b/lib/fluxsource/fluxsource.cc @@ -7,14 +7,14 @@ #include "lib/config/proto.h" #include "lib/core/utils.h" -std::unique_ptr FluxSource::create(Config& config) +FluxSource* FluxSource::create(Config& config) { if (!config.hasFluxSource()) error("no flux source configured"); return create(config->flux_source()); } -std::unique_ptr FluxSource::create(const FluxSourceProto& config) +FluxSource* FluxSource::create(const FluxSourceProto& config) { switch (config.type()) { @@ -49,7 +49,7 @@ std::unique_ptr FluxSource::create(const FluxSourceProto& config) return createFlxFluxSource(config.flx()); default: - return std::unique_ptr(); + return nullptr; } } diff --git a/lib/fluxsource/fluxsource.h b/lib/fluxsource/fluxsource.h index 66319352..0c089a4e 100644 --- a/lib/fluxsource/fluxsource.h +++ b/lib/fluxsource/fluxsource.h @@ -35,33 +35,26 @@ class FluxSource virtual ~FluxSource() {} private: - static std::unique_ptr createA2rFluxSource( - const A2rFluxSourceProto& config); - static std::unique_ptr createCwfFluxSource( - const CwfFluxSourceProto& config); - static std::unique_ptr createDmkFluxSource( - const DmkFluxSourceProto& config); - static std::unique_ptr createEraseFluxSource( + static FluxSource* createA2rFluxSource(const A2rFluxSourceProto& config); + static FluxSource* createCwfFluxSource(const CwfFluxSourceProto& config); + static FluxSource* createDmkFluxSource(const DmkFluxSourceProto& config); + static FluxSource* createEraseFluxSource( const EraseFluxSourceProto& config); - static std::unique_ptr createFl2FluxSource( - const Fl2FluxSourceProto& config); - static std::unique_ptr createFlxFluxSource( - const FlxFluxSourceProto& config); - static std::unique_ptr createHardwareFluxSource( + static FluxSource* createFl2FluxSource(const Fl2FluxSourceProto& config); + static FluxSource* createFlxFluxSource(const FlxFluxSourceProto& config); + static FluxSource* createHardwareFluxSource( const HardwareFluxSourceProto& config); - static std::unique_ptr createKryofluxFluxSource( + static FluxSource* createKryofluxFluxSource( const KryofluxFluxSourceProto& config); - static std::unique_ptr createScpFluxSource( - const ScpFluxSourceProto& config); - static std::unique_ptr createTestPatternFluxSource( + static FluxSource* createScpFluxSource(const ScpFluxSourceProto& config); + static FluxSource* createTestPatternFluxSource( const TestPatternFluxSourceProto& config); public: - static std::unique_ptr createMemoryFluxSource( - const Disk& flux); + static FluxSource* createMemoryFluxSource(const Disk& flux); - static std::unique_ptr create(Config& config); - static std::unique_ptr create(const FluxSourceProto& spec); + static FluxSource* create(Config& config); + static FluxSource* create(const FluxSourceProto& spec); public: /* Returns any configuration this flux source might be carrying (e.g. tpi diff --git a/lib/fluxsource/flxfluxsource.cc b/lib/fluxsource/flxfluxsource.cc index 922cfc43..c362f6e3 100644 --- a/lib/fluxsource/flxfluxsource.cc +++ b/lib/fluxsource/flxfluxsource.cc @@ -43,8 +43,7 @@ class FlxFluxSource : public TrivialFluxSource const std::string _path; }; -std::unique_ptr FluxSource::createFlxFluxSource( - const FlxFluxSourceProto& config) +FluxSource* FluxSource::createFlxFluxSource(const FlxFluxSourceProto& config) { - return std::make_unique(config); + return new FlxFluxSource(config); } diff --git a/lib/fluxsource/hardwarefluxsource.cc b/lib/fluxsource/hardwarefluxsource.cc index 670c3c1f..5005aeb1 100644 --- a/lib/fluxsource/hardwarefluxsource.cc +++ b/lib/fluxsource/hardwarefluxsource.cc @@ -78,8 +78,8 @@ class HardwareFluxSource : public FluxSource bool _measured; }; -std::unique_ptr FluxSource::createHardwareFluxSource( +FluxSource* FluxSource::createHardwareFluxSource( const HardwareFluxSourceProto& config) { - return std::unique_ptr(new HardwareFluxSource(config)); + return new HardwareFluxSource(config); } diff --git a/lib/fluxsource/kryofluxfluxsource.cc b/lib/fluxsource/kryofluxfluxsource.cc index 7df73478..56b37f0c 100644 --- a/lib/fluxsource/kryofluxfluxsource.cc +++ b/lib/fluxsource/kryofluxfluxsource.cc @@ -40,8 +40,8 @@ class KryofluxFluxSource : public TrivialFluxSource const std::string _path; }; -std::unique_ptr FluxSource::createKryofluxFluxSource( +FluxSource* FluxSource::createKryofluxFluxSource( const KryofluxFluxSourceProto& config) { - return std::make_unique(config); + return new KryofluxFluxSource(config); } diff --git a/lib/fluxsource/memoryfluxsource.cc b/lib/fluxsource/memoryfluxsource.cc index 68514626..0f51717f 100644 --- a/lib/fluxsource/memoryfluxsource.cc +++ b/lib/fluxsource/memoryfluxsource.cc @@ -8,7 +8,7 @@ class MemoryFluxSourceIterator : public FluxSourceIterator { - using multimap = std::multimap>; + using multimap = std::multimap; public: MemoryFluxSourceIterator( @@ -65,7 +65,7 @@ class MemoryFluxSource : public FluxSource const Disk& _flux; }; -std::unique_ptr FluxSource::createMemoryFluxSource(const Disk& flux) +FluxSource* FluxSource::createMemoryFluxSource(const Disk& flux) { - return std::make_unique(flux); + return new MemoryFluxSource(flux); } diff --git a/lib/fluxsource/scpfluxsource.cc b/lib/fluxsource/scpfluxsource.cc index 61c42fba..7d14924f 100644 --- a/lib/fluxsource/scpfluxsource.cc +++ b/lib/fluxsource/scpfluxsource.cc @@ -155,8 +155,7 @@ class ScpFluxSource : public TrivialFluxSource nanoseconds_t _resolution; }; -std::unique_ptr FluxSource::createScpFluxSource( - const ScpFluxSourceProto& config) +FluxSource* FluxSource::createScpFluxSource(const ScpFluxSourceProto& config) { - return std::unique_ptr(new ScpFluxSource(config)); + return new ScpFluxSource(config); } diff --git a/lib/fluxsource/testpatternfluxsource.cc b/lib/fluxsource/testpatternfluxsource.cc index 8e332153..a99c04e0 100644 --- a/lib/fluxsource/testpatternfluxsource.cc +++ b/lib/fluxsource/testpatternfluxsource.cc @@ -35,8 +35,8 @@ class TestPatternFluxSource : public TrivialFluxSource const TestPatternFluxSourceProto& _config; }; -std::unique_ptr FluxSource::createTestPatternFluxSource( +FluxSource* FluxSource::createTestPatternFluxSource( const TestPatternFluxSourceProto& config) { - return std::make_unique(config); + return new TestPatternFluxSource(config); } diff --git a/lib/imagereader/d64imagereader.cc b/lib/imagereader/d64imagereader.cc index caf5ecdc..1b2c6599 100644 --- a/lib/imagereader/d64imagereader.cc +++ b/lib/imagereader/d64imagereader.cc @@ -14,7 +14,7 @@ class D64ImageReader : public ImageReader public: D64ImageReader(const ImageReaderProto& config): ImageReader(config) {} - std::unique_ptr readImage() override + Image* readImage() override { std::ifstream inputFile( _config.filename(), std::ios::in | std::ios::binary); @@ -52,7 +52,7 @@ class D64ImageReader : public ImageReader return 17; }; - std::unique_ptr image(new Image); + Image* image(new Image); for (int track = 0; track < 40; track++) { int numSectors = sectorsPerTrack(track); diff --git a/lib/imagereader/d88imagereader.cc b/lib/imagereader/d88imagereader.cc index 3108e5c8..a11dd5a6 100644 --- a/lib/imagereader/d88imagereader.cc +++ b/lib/imagereader/d88imagereader.cc @@ -18,7 +18,7 @@ class D88ImageReader : public ImageReader public: D88ImageReader(const ImageReaderProto& config): ImageReader(config) {} - std::unique_ptr readImage() override + Image* readImage() override { std::ifstream inputFile( _config.filename(), std::ios::in | std::ios::binary); @@ -71,7 +71,7 @@ class D88ImageReader : public ImageReader } auto layout = _extraConfig.mutable_layout(); - std::unique_ptr image(new Image); + Image* image(new Image); for (int track = 0; track < trackTableSize / 4; track++) { int trackOffset = trackTableReader.seek(track * 4).read_le32(); diff --git a/lib/imagereader/dimimagereader.cc b/lib/imagereader/dimimagereader.cc index 0604d064..656adc6e 100644 --- a/lib/imagereader/dimimagereader.cc +++ b/lib/imagereader/dimimagereader.cc @@ -19,7 +19,7 @@ class DimImageReader : public ImageReader public: DimImageReader(const ImageReaderProto& config): ImageReader(config) {} - std::unique_ptr readImage() override + Image* readImage() override { std::ifstream inputFile( _config.filename(), std::ios::in | std::ios::binary); @@ -65,7 +65,7 @@ class DimImageReader : public ImageReader break; } - std::unique_ptr image(new Image); + Image* image(new Image); int trackCount = 0; for (int track = 0; track < tracks; track++) { diff --git a/lib/imagereader/diskcopyimagereader.cc b/lib/imagereader/diskcopyimagereader.cc index 277a33ba..99af2dc8 100644 --- a/lib/imagereader/diskcopyimagereader.cc +++ b/lib/imagereader/diskcopyimagereader.cc @@ -14,7 +14,7 @@ class DiskCopyImageReader : public ImageReader public: DiskCopyImageReader(const ImageReaderProto& config): ImageReader(config) {} - std::unique_ptr readImage() override + Image* readImage() override { std::ifstream inputFile( _config.filename(), std::ios::in | std::ios::binary); @@ -88,7 +88,7 @@ class DiskCopyImageReader : public ImageReader uint32_t dataPtr = 0x54; uint32_t tagPtr = dataPtr + dataSize; - std::unique_ptr image(new Image); + Image* image(new Image); for (int track = 0; track < numCylinders; track++) { int numSectors = sectorsPerTrack(track); diff --git a/lib/imagereader/fdiimagereader.cc b/lib/imagereader/fdiimagereader.cc index 1724a13a..93e02aea 100644 --- a/lib/imagereader/fdiimagereader.cc +++ b/lib/imagereader/fdiimagereader.cc @@ -19,7 +19,7 @@ class FdiImageReader : public ImageReader public: FdiImageReader(const ImageReaderProto& config): ImageReader(config) {} - std::unique_ptr readImage() override + Image* readImage() override { std::ifstream inputFile( _config.filename(), std::ios::in | std::ios::binary); @@ -44,7 +44,7 @@ class FdiImageReader : public ImageReader inputFile.seekg(headerSize); - std::unique_ptr image(new Image); + Image* image(new Image); int trackCount = 0; for (int track = 0; track < tracks; track++) { diff --git a/lib/imagereader/imagereader.h b/lib/imagereader/imagereader.h index 7c5a6e2c..f394e7f6 100644 --- a/lib/imagereader/imagereader.h +++ b/lib/imagereader/imagereader.h @@ -53,11 +53,11 @@ class ImageReader /* Reads the image. */ - virtual std::unique_ptr readImage() = 0; + virtual Image* readImage() = 0; protected: const ImageReaderProto& _config; - std::shared_ptr _layout; + const DiskLayout* _layout; ConfigProto _extraConfig; }; diff --git a/lib/imagereader/imdimagereader.cc b/lib/imagereader/imdimagereader.cc index d5fb3c9c..d75309c5 100644 --- a/lib/imagereader/imdimagereader.cc +++ b/lib/imagereader/imdimagereader.cc @@ -137,7 +137,7 @@ class IMDImageReader : public ImageReader * */ // clang-format on - std::unique_ptr readImage() override + Image* readImage() override { // Read File std::ifstream inputFile( @@ -153,7 +153,7 @@ class IMDImageReader : public ImageReader Bytes data; data.writer() += inputFile; ByteReader br(data); - std::unique_ptr image(new Image); + Image* image(new Image); TrackHeader header = {0, 0, 0, 0, 0}; TrackHeader previousheader = {0, 0, 0, 0, 0}; diff --git a/lib/imagereader/imgimagereader.cc b/lib/imagereader/imgimagereader.cc index b93b7eb9..151e9a5e 100644 --- a/lib/imagereader/imgimagereader.cc +++ b/lib/imagereader/imgimagereader.cc @@ -18,7 +18,7 @@ class ImgImageReader : public ImageReader public: ImgImageReader(const ImageReaderProto& config): ImageReader(config) {} - std::unique_ptr readImage() override + Image* readImage() override { std::ifstream inputFile( _config.filename(), std::ios::in | std::ios::binary); @@ -33,7 +33,7 @@ class ImgImageReader : public ImageReader const auto diskLayout = createDiskLayout(); bool in_filesystem_order = _config.img().filesystem_sector_order(); - std::unique_ptr image(new Image); + Image* image(new Image); for (auto& logicalLocation : in_filesystem_order ? diskLayout->logicalLocationsInFilesystemOrder diff --git a/lib/imagereader/jv3imagereader.cc b/lib/imagereader/jv3imagereader.cc index 860aaf22..359e07b8 100644 --- a/lib/imagereader/jv3imagereader.cc +++ b/lib/imagereader/jv3imagereader.cc @@ -89,7 +89,7 @@ class Jv3ImageReader : public ImageReader public: Jv3ImageReader(const ImageReaderProto& config): ImageReader(config) {} - std::unique_ptr readImage() override + Image* readImage() override { std::ifstream inputFile( _config.filename(), std::ios::in | std::ios::binary); @@ -99,7 +99,7 @@ class Jv3ImageReader : public ImageReader inputFile.seekg(0, std::ios::end); unsigned inputFileSize = inputFile.tellg(); unsigned headerPtr = 0; - std::unique_ptr image(new Image); + Image* image(new Image); for (;;) { unsigned dataPtr = headerPtr + 2901 * 3 + 1; diff --git a/lib/imagereader/nfdimagereader.cc b/lib/imagereader/nfdimagereader.cc index 6fc046ff..1dfd46af 100644 --- a/lib/imagereader/nfdimagereader.cc +++ b/lib/imagereader/nfdimagereader.cc @@ -18,7 +18,7 @@ class NFDImageReader : public ImageReader public: NFDImageReader(const ImageReaderProto& config): ImageReader(config) {} - std::unique_ptr readImage() override + Image* readImage() override { std::ifstream inputFile( _config.filename(), std::ios::in | std::ios::binary); @@ -60,7 +60,7 @@ class NFDImageReader : public ImageReader _extraConfig.mutable_drive()->set_high_density(true); _extraConfig.mutable_layout()->set_format_type(FORMATTYPE_80TRACK); - std::unique_ptr image(new Image); + Image* image(new Image); for (int track = 0; track < 163; track++) { auto trackdata = ibm->add_trackdata(); diff --git a/lib/imagereader/nsiimagereader.cc b/lib/imagereader/nsiimagereader.cc index 96a94263..235b0fa0 100644 --- a/lib/imagereader/nsiimagereader.cc +++ b/lib/imagereader/nsiimagereader.cc @@ -16,7 +16,7 @@ class NsiImageReader : public ImageReader public: NsiImageReader(const ImageReaderProto& config): ImageReader(config) {} - std::unique_ptr readImage() override + Image* readImage() override { std::ifstream inputFile( _config.filename(), std::ios::in | std::ios::binary); @@ -66,7 +66,7 @@ class NsiImageReader : public ImageReader sectorSize, numCylinders * numHeads * trackSize / 1024); - std::unique_ptr image(new Image); + Image* image(new Image); unsigned sectorFileOffset; for (unsigned head = 0; head < numHeads; head++) diff --git a/lib/imagereader/td0imagereader.cc b/lib/imagereader/td0imagereader.cc index 237741ee..8c49f477 100644 --- a/lib/imagereader/td0imagereader.cc +++ b/lib/imagereader/td0imagereader.cc @@ -47,7 +47,7 @@ class Td0ImageReader : public ImageReader public: Td0ImageReader(const ImageReaderProto& config): ImageReader(config) {} - std::unique_ptr readImage() override + Image* readImage() override { std::ifstream inputFile( _config.filename(), std::ios::in | std::ios::binary); @@ -100,7 +100,7 @@ class Td0ImageReader : public ImageReader log("TD0: TeleDisk {}.{}: {}", version / 10, version % 10, comment); unsigned totalSize = 0; - std::unique_ptr image(new Image); + Image* image(new Image); for (;;) { /* Read track header */ diff --git a/lib/imagewriter/d88imagewriter.cc b/lib/imagewriter/d88imagewriter.cc index 963d7414..91da7b04 100644 --- a/lib/imagewriter/d88imagewriter.cc +++ b/lib/imagewriter/d88imagewriter.cc @@ -70,7 +70,7 @@ class D88ImageWriter : public ImageWriter headerWriter.seek(0x20 + 4 * track); headerWriter.write_le32(trackOffset); int side = track & 1; - std::vector> sectors; + std::vector sectors; for (int sectorId = geometry.firstSector; sectorId <= geometry.numSectors; sectorId++) @@ -83,8 +83,7 @@ class D88ImageWriter : public ImageWriter } std::sort(begin(sectors), end(sectors), - [](std::shared_ptr a, - std::shared_ptr b) + [](const Sector* a, const Sector* b) { return a->position < b->position; }); diff --git a/lib/vfs/acorndfs.cc b/lib/vfs/acorndfs.cc index 30e51d1e..552d50b7 100644 --- a/lib/vfs/acorndfs.cc +++ b/lib/vfs/acorndfs.cc @@ -107,8 +107,8 @@ class AcornDfsFilesystem : public Filesystem { public: AcornDfsFilesystem(const AcornDfsProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr sectors): + const DiskLayout* diskLayout, + SectorInterface* sectors): Filesystem(diskLayout, sectors), _config(config) { @@ -178,11 +178,9 @@ class AcornDfsFilesystem : public Filesystem const AcornDfsProto& _config; }; -std::unique_ptr Filesystem::createAcornDfsFilesystem( - const FilesystemProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr sectors) +Filesystem* Filesystem::createAcornDfsFilesystem(const FilesystemProto& config, + const DiskLayout* diskLayout, + SectorInterface* sectors) { - return std::make_unique( - config.acorndfs(), diskLayout, sectors); + return new AcornDfsFilesystem(config.acorndfs(), diskLayout, sectors); } diff --git a/lib/vfs/amigaffs.cc b/lib/vfs/amigaffs.cc index d7b53ce0..fca97b94 100644 --- a/lib/vfs/amigaffs.cc +++ b/lib/vfs/amigaffs.cc @@ -51,8 +51,8 @@ class AmigaFfsFilesystem : public Filesystem { public: AmigaFfsFilesystem(const AmigaFfsProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr sectors): + const DiskLayout* diskLayout, + SectorInterface* sectors): Filesystem(diskLayout, sectors), _config(config) { @@ -289,7 +289,7 @@ class AmigaFfsFilesystem : public Filesystem adfFreeEntry(_entry); } - operator struct Entry *() const + operator struct Entry*() const { return _entry; } @@ -314,7 +314,7 @@ class AmigaFfsFilesystem : public Filesystem adfFreeDirList(_list); } - operator struct List *() const + operator struct List*() const { return _list; } @@ -470,11 +470,9 @@ static BOOL adfIsDevNative(char*) return true; } -std::unique_ptr Filesystem::createAmigaFfsFilesystem( - const FilesystemProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr sectors) +Filesystem* Filesystem::createAmigaFfsFilesystem(const FilesystemProto& config, + const DiskLayout* diskLayout, + SectorInterface* sectors) { - return std::make_unique( - config.amigaffs(), diskLayout, sectors); + return new AmigaFfsFilesystem(config.amigaffs(), diskLayout, sectors); } diff --git a/lib/vfs/appledos.cc b/lib/vfs/appledos.cc index b8f78ad3..a2ebf3c0 100644 --- a/lib/vfs/appledos.cc +++ b/lib/vfs/appledos.cc @@ -44,8 +44,8 @@ class AppledosFilesystem : public Filesystem public: AppledosFilesystem(const AppledosProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr sectors): + const DiskLayout* diskLayout, + SectorInterface* sectors): Filesystem(diskLayout, sectors), _config(config) { @@ -175,11 +175,9 @@ class AppledosFilesystem : public Filesystem std::vector> _dirents; }; -std::unique_ptr Filesystem::createAppledosFilesystem( - const FilesystemProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr sectors) +Filesystem* Filesystem::createAppledosFilesystem(const FilesystemProto& config, + const DiskLayout* diskLayout, + SectorInterface* sectors) { - return std::make_unique( - config.appledos(), diskLayout, sectors); + return new AppledosFilesystem(config.appledos(), diskLayout, sectors); } diff --git a/lib/vfs/brother120fs.cc b/lib/vfs/brother120fs.cc index 63d5f5cc..ed2b134d 100644 --- a/lib/vfs/brother120fs.cc +++ b/lib/vfs/brother120fs.cc @@ -226,8 +226,8 @@ class Brother120Filesystem : public Filesystem { public: Brother120Filesystem(const Brother120FsProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr sectors): + const DiskLayout* diskLayout, + SectorInterface* sectors): Filesystem(diskLayout, sectors), _config(config) { @@ -348,11 +348,10 @@ class Brother120Filesystem : public Filesystem const Brother120FsProto& _config; }; -std::unique_ptr Filesystem::createBrother120Filesystem( +Filesystem* Filesystem::createBrother120Filesystem( const FilesystemProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr sectors) + const DiskLayout* diskLayout, + SectorInterface* sectors) { - return std::make_unique( - config.brother120(), diskLayout, sectors); + return new Brother120Filesystem(config.brother120(), diskLayout, sectors); } diff --git a/lib/vfs/cbmfs.cc b/lib/vfs/cbmfs.cc index 322c1f9a..66f2539c 100644 --- a/lib/vfs/cbmfs.cc +++ b/lib/vfs/cbmfs.cc @@ -190,8 +190,8 @@ class CbmfsFilesystem : public Filesystem public: CbmfsFilesystem(const CbmfsProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr sectors): + const DiskLayout* diskLayout, + SectorInterface* sectors): Filesystem(diskLayout, sectors), _config(config) { @@ -281,11 +281,9 @@ class CbmfsFilesystem : public Filesystem const CbmfsProto& _config; }; -std::unique_ptr Filesystem::createCbmfsFilesystem( - const FilesystemProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr sectors) +Filesystem* Filesystem::createCbmfsFilesystem(const FilesystemProto& config, + const DiskLayout* diskLayout, + SectorInterface* sectors) { - return std::make_unique( - config.cbmfs(), diskLayout, sectors); + return new CbmfsFilesystem(config.cbmfs(), diskLayout, sectors); } diff --git a/lib/vfs/cpmfs.cc b/lib/vfs/cpmfs.cc index d320a52e..675a9567 100644 --- a/lib/vfs/cpmfs.cc +++ b/lib/vfs/cpmfs.cc @@ -184,8 +184,8 @@ class CpmFsFilesystem : public Filesystem, public HasBitmap, public HasMount public: CpmFsFilesystem(const CpmFsProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr sectors): + const DiskLayout* diskLayout, + SectorInterface* sectors): Filesystem(diskLayout, sectors), _config(config) { @@ -661,11 +661,9 @@ class CpmFsFilesystem : public Filesystem, public HasBitmap, public HasMount std::vector _bitmap; }; -std::unique_ptr Filesystem::createCpmFsFilesystem( - const FilesystemProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr sectors) +Filesystem* Filesystem::createCpmFsFilesystem(const FilesystemProto& config, + const DiskLayout* diskLayout, + SectorInterface* sectors) { - return std::make_unique( - config.cpmfs(), diskLayout, sectors); + return new CpmFsFilesystem(config.cpmfs(), diskLayout, sectors); } diff --git a/lib/vfs/fatfs.cc b/lib/vfs/fatfs.cc index 798efb1f..e8af1332 100644 --- a/lib/vfs/fatfs.cc +++ b/lib/vfs/fatfs.cc @@ -30,8 +30,8 @@ class FatFsFilesystem : public Filesystem { public: FatFsFilesystem(const FatFsProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr sectors): + const DiskLayout* diskLayout, + SectorInterface* sectors): Filesystem(diskLayout, sectors), _config(config) { @@ -336,11 +336,9 @@ DWORD get_fattime(void) return 0; } -std::unique_ptr Filesystem::createFatFsFilesystem( - const FilesystemProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr sectors) +Filesystem* Filesystem::createFatFsFilesystem(const FilesystemProto& config, + const DiskLayout* diskLayout, + SectorInterface* sectors) { - return std::make_unique( - config.fatfs(), diskLayout, sectors); + return new FatFsFilesystem(config.fatfs(), diskLayout, sectors); } diff --git a/lib/vfs/fluxsectorinterface.cc b/lib/vfs/fluxsectorinterface.cc index 6b95e4eb..5b4c75dd 100644 --- a/lib/vfs/fluxsectorinterface.cc +++ b/lib/vfs/fluxsectorinterface.cc @@ -11,11 +11,11 @@ class FluxSectorInterface : public SectorInterface { public: - FluxSectorInterface(const std::shared_ptr& diskLayout, - std::shared_ptr fluxSource, - std::shared_ptr fluxSinkFactory, - std::shared_ptr encoder, - std::shared_ptr decoder): + FluxSectorInterface(const DiskLayout* diskLayout, + FluxSource* fluxSource, + FluxSinkFactory* fluxSinkFactory, + Encoder* encoder, + Decoder* decoder): _diskLayout(diskLayout), _fluxSource(fluxSource), _fluxSink(fluxSinkFactory), @@ -25,8 +25,7 @@ class FluxSectorInterface : public SectorInterface } public: - std::shared_ptr get( - unsigned track, unsigned side, unsigned sectorId) override + const Sector* get(unsigned track, unsigned side, unsigned sectorId) override { auto it = _changedSectors.get(track, side, sectorId); if (it) @@ -39,8 +38,7 @@ class FluxSectorInterface : public SectorInterface return _loadedSectors.get(track, side, sectorId); } - std::shared_ptr put( - unsigned track, unsigned side, unsigned sectorId) override + Sector* put(unsigned track, unsigned side, unsigned sectorId) override { CylinderHead trackid(track, side); _changedTracks.insert(trackid); @@ -97,10 +95,10 @@ class FluxSectorInterface : public SectorInterface writeDiskCommand(*_diskLayout, _changedSectors, - *_encoder, - *_fluxSink, - _decoder.get(), - _fluxSource.get(), + _encoder, + _fluxSink, + _decoder, + _fluxSource, locations); discardChanges(); @@ -132,11 +130,11 @@ class FluxSectorInterface : public SectorInterface { CylinderHead logicalLocation = {logicalCylinder, logicalSide}; auto& ltl = _diskLayout->layoutByLogicalLocation.at(logicalLocation); - std::vector> trackFluxes; - std::vector> trackSectors; + std::vector trackFluxes; + std::vector trackSectors; readAndDecodeTrack(*_diskLayout, - *_fluxSource, - *_decoder, + _fluxSource, + _decoder, ltl, trackFluxes, trackSectors); @@ -147,11 +145,11 @@ class FluxSectorInterface : public SectorInterface _loadedTracks.insert(logicalLocation); } - std::shared_ptr _diskLayout; - std::shared_ptr _fluxSource; - std::shared_ptr _fluxSink; - std::shared_ptr _encoder; - std::shared_ptr _decoder; + const DiskLayout* _diskLayout; + FluxSource* _fluxSource; + FluxSinkFactory* _fluxSink; + Encoder* _encoder; + Decoder* _decoder; Image _loadedSectors; Image _changedSectors; @@ -160,13 +158,13 @@ class FluxSectorInterface : public SectorInterface std::set _changedTracks; }; -std::unique_ptr SectorInterface::createFluxSectorInterface( - const std::shared_ptr& diskLayout, - std::shared_ptr fluxSource, - std::shared_ptr fluxSinkFactory, - std::shared_ptr encoder, - std::shared_ptr decoder) +SectorInterface* SectorInterface::createFluxSectorInterface( + const DiskLayout* diskLayout, + FluxSource* fluxSource, + FluxSinkFactory* fluxSinkFactory, + Encoder* encoder, + Decoder* decoder) { - return std::make_unique( + return new FluxSectorInterface( diskLayout, fluxSource, fluxSinkFactory, encoder, decoder); } diff --git a/lib/vfs/imagesectorinterface.cc b/lib/vfs/imagesectorinterface.cc index 534c6acc..85ac3886 100644 --- a/lib/vfs/imagesectorinterface.cc +++ b/lib/vfs/imagesectorinterface.cc @@ -10,7 +10,7 @@ class ImageSectorInterface : public SectorInterface { public: - ImageSectorInterface(const std::shared_ptr& diskLayout, + ImageSectorInterface(const DiskLayout* diskLayout, const std::shared_ptr& reader, const std::shared_ptr& writer): _diskLayout(diskLayout), @@ -21,14 +21,12 @@ class ImageSectorInterface : public SectorInterface } public: - std::shared_ptr get( - unsigned track, unsigned side, unsigned sectorId) override + const Sector* get(unsigned track, unsigned side, unsigned sectorId) override { return _image->get(track, side, sectorId); } - std::shared_ptr put( - unsigned track, unsigned side, unsigned sectorId) override + Sector* put(unsigned track, unsigned side, unsigned sectorId) override { _changed = true; return _image->put(track, side, sectorId); @@ -56,24 +54,24 @@ class ImageSectorInterface : public SectorInterface _image = _reader->readImage(); else { - _image = std::make_shared(); + _image = new Image(); _image->addMissingSectors(*_diskLayout); } _changed = false; } private: - std::shared_ptr _image; - std::shared_ptr _diskLayout; + Image* _image; + const DiskLayout* _diskLayout; std::shared_ptr _reader; std::shared_ptr _writer; bool _changed = false; }; -std::unique_ptr SectorInterface::createImageSectorInterface( - const std::shared_ptr& diskLayout, +SectorInterface* SectorInterface::createImageSectorInterface( + const DiskLayout* diskLayout, std::shared_ptr reader, std::shared_ptr writer) { - return std::make_unique(diskLayout, reader, writer); + return new ImageSectorInterface(diskLayout, reader, writer); } diff --git a/lib/vfs/lif.cc b/lib/vfs/lif.cc index 85a0051c..db3a70bd 100644 --- a/lib/vfs/lif.cc +++ b/lib/vfs/lif.cc @@ -135,8 +135,8 @@ class LifFilesystem : public Filesystem public: LifFilesystem(const LifProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr sectors): + const DiskLayout* diskLayout, + SectorInterface* sectors): Filesystem(diskLayout, sectors), _config(config) { @@ -288,10 +288,9 @@ class LifFilesystem : public Filesystem std::vector> _dirents; }; -std::unique_ptr Filesystem::createLifFilesystem( - const FilesystemProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr sectors) +Filesystem* Filesystem::createLifFilesystem(const FilesystemProto& config, + const DiskLayout* diskLayout, + SectorInterface* sectors) { - return std::make_unique(config.lif(), diskLayout, sectors); + return new LifFilesystem(config.lif(), diskLayout, sectors); } diff --git a/lib/vfs/machfs.cc b/lib/vfs/machfs.cc index ecd2f92a..1f967980 100644 --- a/lib/vfs/machfs.cc +++ b/lib/vfs/machfs.cc @@ -17,8 +17,8 @@ class MacHfsFilesystem : public Filesystem { public: MacHfsFilesystem(const MacHfsProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr sectors): + const DiskLayout* diskLayout, + SectorInterface* sectors): Filesystem(diskLayout, sectors), _config(config) { @@ -459,11 +459,9 @@ unsigned long os_write(void** priv, const void* buffer, unsigned long len) return self->hfsWrite(buffer, len); } -std::unique_ptr Filesystem::createMacHfsFilesystem( - const FilesystemProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr sectors) +Filesystem* Filesystem::createMacHfsFilesystem(const FilesystemProto& config, + const DiskLayout* diskLayout, + SectorInterface* sectors) { - return std::make_unique( - config.machfs(), diskLayout, sectors); + return new MacHfsFilesystem(config.machfs(), diskLayout, sectors); } diff --git a/lib/vfs/memorysectorinterface.cc b/lib/vfs/memorysectorinterface.cc index 49956f2c..ec2828d2 100644 --- a/lib/vfs/memorysectorinterface.cc +++ b/lib/vfs/memorysectorinterface.cc @@ -10,20 +10,18 @@ class MemorySectorInterface : public SectorInterface { public: - MemorySectorInterface(std::shared_ptr image): _backupImage(image) + MemorySectorInterface(Image* image): _backupImage(image) { discardChanges(); } public: - std::shared_ptr get( - unsigned track, unsigned side, unsigned sectorId) override + const Sector* get(unsigned track, unsigned side, unsigned sectorId) override { return _liveImage->get(track, side, sectorId); } - std::shared_ptr put( - unsigned track, unsigned side, unsigned sectorId) override + Sector* put(unsigned track, unsigned side, unsigned sectorId) override { _changed = true; return _liveImage->put(track, side, sectorId); @@ -53,7 +51,7 @@ class MemorySectorInterface : public SectorInterface void discardChanges() override { - _liveImage = std::make_unique(); + _liveImage = new Image(); for (auto sector : *_backupImage) { auto s = _liveImage->put(sector->logicalCylinder, @@ -65,13 +63,12 @@ class MemorySectorInterface : public SectorInterface } private: - std::shared_ptr _backupImage; - std::shared_ptr _liveImage; + Image* _backupImage = nullptr; + Image* _liveImage = nullptr; bool _changed = false; }; -std::unique_ptr SectorInterface::createMemorySectorInterface( - std::shared_ptr image) +SectorInterface* SectorInterface::createMemorySectorInterface(Image* image) { - return std::make_unique(image); + return new MemorySectorInterface(image); } diff --git a/lib/vfs/microdos.cc b/lib/vfs/microdos.cc index 07b35dd0..f6ee0c4e 100644 --- a/lib/vfs/microdos.cc +++ b/lib/vfs/microdos.cc @@ -95,8 +95,8 @@ class MicrodosFilesystem : public Filesystem public: MicrodosFilesystem(const MicrodosProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr sectors): + const DiskLayout* diskLayout, + SectorInterface* sectors): Filesystem(diskLayout, sectors), _config(config) { @@ -217,11 +217,9 @@ class MicrodosFilesystem : public Filesystem std::vector> _dirents; }; -std::unique_ptr Filesystem::createMicrodosFilesystem( - const FilesystemProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr sectors) +Filesystem* Filesystem::createMicrodosFilesystem(const FilesystemProto& config, + const DiskLayout* diskLayout, + SectorInterface* sectors) { - return std::make_unique( - config.microdos(), diskLayout, sectors); + return new MicrodosFilesystem(config.microdos(), diskLayout, sectors); } diff --git a/lib/vfs/philefs.cc b/lib/vfs/philefs.cc index c38a3496..5c121930 100644 --- a/lib/vfs/philefs.cc +++ b/lib/vfs/philefs.cc @@ -158,8 +158,8 @@ class PhileFilesystem : public Filesystem public: PhileFilesystem(const PhileProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr sectors): + const DiskLayout* diskLayout, + SectorInterface* sectors): Filesystem(diskLayout, sectors), _config(config) { @@ -293,11 +293,9 @@ class PhileFilesystem : public Filesystem std::map> _dirents; }; -std::unique_ptr Filesystem::createPhileFilesystem( - const FilesystemProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr sectors) +Filesystem* Filesystem::createPhileFilesystem(const FilesystemProto& config, + const DiskLayout* diskLayout, + SectorInterface* sectors) { - return std::make_unique( - config.phile(), diskLayout, sectors); + return new PhileFilesystem(config.phile(), diskLayout, sectors); } diff --git a/lib/vfs/prodos.cc b/lib/vfs/prodos.cc index 6426839a..258c78d8 100644 --- a/lib/vfs/prodos.cc +++ b/lib/vfs/prodos.cc @@ -134,8 +134,8 @@ class ProdosFilesystem : public Filesystem public: ProdosFilesystem(const ProdosProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr sectors): + const DiskLayout* diskLayout, + SectorInterface* sectors): Filesystem(diskLayout, sectors), _config(config) { @@ -302,11 +302,9 @@ class ProdosFilesystem : public Filesystem std::vector _allocationBitmap; }; -std::unique_ptr Filesystem::createProdosFilesystem( - const FilesystemProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr sectors) +Filesystem* Filesystem::createProdosFilesystem(const FilesystemProto& config, + const DiskLayout* diskLayout, + SectorInterface* sectors) { - return std::make_unique( - config.prodos(), diskLayout, sectors); + return new ProdosFilesystem(config.prodos(), diskLayout, sectors); } diff --git a/lib/vfs/roland.cc b/lib/vfs/roland.cc index dee73426..5846a251 100644 --- a/lib/vfs/roland.cc +++ b/lib/vfs/roland.cc @@ -94,8 +94,8 @@ class RolandFsFilesystem : public Filesystem public: RolandFsFilesystem(const RolandFsProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr sectors): + const DiskLayout* diskLayout, + SectorInterface* sectors): Filesystem(diskLayout, sectors), _config(config) { @@ -421,11 +421,9 @@ class RolandFsFilesystem : public Filesystem std::vector _allocationBitmap; }; -std::unique_ptr Filesystem::createRolandFsFilesystem( - const FilesystemProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr sectors) +Filesystem* Filesystem::createRolandFsFilesystem(const FilesystemProto& config, + const DiskLayout* diskLayout, + SectorInterface* sectors) { - return std::make_unique( - config.roland(), diskLayout, sectors); + return new RolandFsFilesystem(config.roland(), diskLayout, sectors); } diff --git a/lib/vfs/sectorinterface.h b/lib/vfs/sectorinterface.h index 84101ad8..f8c15c0b 100644 --- a/lib/vfs/sectorinterface.h +++ b/lib/vfs/sectorinterface.h @@ -17,10 +17,9 @@ class SectorInterface virtual ~SectorInterface() {} public: - virtual std::shared_ptr get( - unsigned track, unsigned side, unsigned sectorId) = 0; - virtual std::shared_ptr put( + virtual const Sector* get( unsigned track, unsigned side, unsigned sectorId) = 0; + virtual Sector* put(unsigned track, unsigned side, unsigned sectorId) = 0; virtual bool isReadOnly() { @@ -37,18 +36,17 @@ class SectorInterface virtual void discardChanges() {} public: - static std::unique_ptr createMemorySectorInterface( - std::shared_ptr image); - static std::unique_ptr createImageSectorInterface( - const std::shared_ptr& diskLayout, + static SectorInterface* createMemorySectorInterface(Image* image); + static SectorInterface* createImageSectorInterface( + const DiskLayout* diskLayout, std::shared_ptr reader, std::shared_ptr writer); - static std::unique_ptr createFluxSectorInterface( - const std::shared_ptr& diskLayout, - std::shared_ptr fluxSource, - std::shared_ptr fluxSinkFactory, - std::shared_ptr encoder, - std::shared_ptr decoder); + static SectorInterface* createFluxSectorInterface( + const DiskLayout* diskLayout, + FluxSource* fluxSource, + FluxSinkFactory* fluxSinkFactory, + Encoder* encoder, + Decoder* decoder); }; #endif diff --git a/lib/vfs/smaky6fs.cc b/lib/vfs/smaky6fs.cc index 0a6a12c8..78c703f7 100644 --- a/lib/vfs/smaky6fs.cc +++ b/lib/vfs/smaky6fs.cc @@ -5,8 +5,8 @@ /* A directory entry looks like: * - * 00-07: name, space-padded ASCII (high bit may be set as attribute flag → mask with 0x7f) - * 08-09: 2-char type code (SY, SM, ST, SR, LS, FH, BS, IM, KS …) + * 00-07: name, space-padded ASCII (high bit may be set as attribute flag → mask + * with 0x7f) 08-09: 2-char type code (SY, SM, ST, SR, LS, FH, BS, IM, KS …) * 0a-0b: uint16 LE start_sector – first data sector (0-based absolute) * 0c-0d: uint16 LE end_sector – first sector after the file (exclusive) * 0e-0f: uint16 LE flags – purpose unknown @@ -70,58 +70,74 @@ class Smaky6Filesystem : public Filesystem ByteReader br(dbuf); br.skip(10); /* skip filename/type already parsed above */ startSector = br.read_le16(); - endSector = br.read_le16(); + endSector = br.read_le16(); uint16_t flags = br.read_le16(); /* purpose unknown */ lastSectorLength = br.read_le16(); - uint8_t loadHi = br.read_8(); - uint8_t loadLo = br.read_8(); + uint8_t loadHi = br.read_8(); + uint8_t loadLo = br.read_8(); uint8_t entryHi = br.read_8(); uint8_t entryLo = br.read_8(); uint8_t monthBcd = br.read_8(); - uint8_t yearBcd = br.read_8(); + uint8_t yearBcd = br.read_8(); /* Decode BCD date; 0x00 and 0xFF both mean "no date" */ - auto bcdToInt = [](uint8_t b) -> int { + auto bcdToInt = [](uint8_t b) -> int + { return (b >> 4) * 10 + (b & 0x0f); }; int month = (monthBcd && monthBcd != 0xff) ? bcdToInt(monthBcd) : 0; - int year = (yearBcd && yearBcd != 0xff) ? bcdToInt(yearBcd) : 0; + int year = (yearBcd && yearBcd != 0xff) ? bcdToInt(yearBcd) : 0; - uint16_t loadAddr = ((uint16_t)loadHi << 8) | loadLo; + uint16_t loadAddr = ((uint16_t)loadHi << 8) | loadLo; uint16_t entryAddr = ((uint16_t)entryHi << 8) | entryLo; /* DR entries are sub-directory containers, not plain files. */ file_type = (filename.size() > 3 && - filename.substr(filename.size() - 3) == ".DR") - ? TYPE_DIRECTORY : TYPE_FILE; + filename.substr(filename.size() - 3) == ".DR") + ? TYPE_DIRECTORY + : TYPE_FILE; /* When lastSectorLength == 0 the last sector is completely full; - * FluxEngine's original formula subtracted 256 bytes in that case. */ - length = lastSectorLength - ? (endSector - startSector - 1) * 256 + lastSectorLength - : (endSector - startSector) * 256; + * FluxEngine's original formula subtracted 256 bytes in that case. + */ + length = lastSectorLength ? (endSector - startSector - 1) * 256 + + lastSectorLength + : (endSector - startSector) * 256; path = {filename}; attributes[Filesystem::FILENAME] = filename; - attributes[Filesystem::LENGTH] = std::to_string(length); + attributes[Filesystem::LENGTH] = std::to_string(length); attributes[Filesystem::FILE_TYPE] = "file"; - attributes[Filesystem::MODE] = ""; + attributes[Filesystem::MODE] = ""; attributes["smaky6.start_sector"] = std::to_string(startSector); - attributes["smaky6.end_sector"] = std::to_string(endSector); - attributes["smaky6.sectors"] = std::to_string(endSector - startSector); - attributes["smaky6.flags"] = fmt::format("0x{:04x}", flags); + attributes["smaky6.end_sector"] = std::to_string(endSector); + attributes["smaky6.sectors"] = + std::to_string(endSector - startSector); + attributes["smaky6.flags"] = fmt::format("0x{:04x}", flags); if (loadAddr) - attributes["smaky6.load_addr"] = fmt::format("0x{:04x}", loadAddr); + attributes["smaky6.load_addr"] = + fmt::format("0x{:04x}", loadAddr); if (entryAddr) - attributes["smaky6.entry_addr"] = fmt::format("0x{:04x}", entryAddr); + attributes["smaky6.entry_addr"] = + fmt::format("0x{:04x}", entryAddr); if (month && year) { - static const char* months[] = {"","Jan","Feb","Mar","Apr","May","Jun", - "Jul","Aug","Sep","Oct","Nov","Dec"}; + static const char* months[] = {"", + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec"}; int yearFull = (year >= 78) ? 1900 + year : 2000 + year; - attributes["smaky6.date"] = - fmt::format("{} {}", - (month >= 1 && month <= 12) ? months[month] : "?", - yearFull); + attributes["smaky6.date"] = fmt::format("{} {}", + (month >= 1 && month <= 12) ? months[month] : "?", + yearFull); } } @@ -163,9 +179,10 @@ class Smaky6Filesystem : public Filesystem { auto de = std::make_shared(dbuf); /* Sub-directory entries use relative sector numbers; - * add the DR container's base sector to get absolute ones. */ + * add the DR container's base sector to get absolute ones. + */ de->startSector += sectorBase; - de->endSector += sectorBase; + de->endSector += sectorBase; dirents.push_back(de); } } @@ -177,8 +194,8 @@ class Smaky6Filesystem : public Filesystem public: Smaky6Filesystem(const Smaky6FsProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr sectors): + const DiskLayout* diskLayout, + SectorInterface* sectors): Filesystem(diskLayout, sectors), _config(config) { @@ -227,8 +244,8 @@ class Smaky6Filesystem : public Filesystem auto de = resolveDirent(path); if (de->file_type == TYPE_DIRECTORY) throw BadPathException(path); - Bytes data = getLogicalSector( - de->startSector, de->endSector - de->startSector); + Bytes data = + getLogicalSector(de->startSector, de->endSector - de->startSector); return data.slice(0, de->length); } @@ -251,7 +268,8 @@ class Smaky6Filesystem : public Filesystem } /* Resolves a full path to its SmakyDirent. - * path=["FILE"] → file in root; path=["DIR.DR","FILE"] → file in sub-dir. */ + * path=["FILE"] → file in root; path=["DIR.DR","FILE"] → file in sub-dir. + */ std::shared_ptr resolveDirent(const Path& path) { if (path.empty()) @@ -263,11 +281,9 @@ class Smaky6Filesystem : public Filesystem const Smaky6FsProto& _config; }; -std::unique_ptr Filesystem::createSmaky6Filesystem( - const FilesystemProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr sectors) +Filesystem* Filesystem::createSmaky6Filesystem(const FilesystemProto& config, + const DiskLayout* diskLayout, + SectorInterface* sectors) { - return std::make_unique( - config.smaky6(), diskLayout, sectors); + return new Smaky6Filesystem(config.smaky6(), diskLayout, sectors); } diff --git a/lib/vfs/vfs.cc b/lib/vfs/vfs.cc index 2b6d8c32..5c3bb06e 100644 --- a/lib/vfs/vfs.cc +++ b/lib/vfs/vfs.cc @@ -23,7 +23,8 @@ Path::Path(const std::vector other): { } -Path::Path(const std::vector::const_iterator& begin, const std::vector::const_iterator& end): +Path::Path(const std::vector::const_iterator& begin, + const std::vector::const_iterator& end): std::vector(begin, end) { } @@ -156,18 +157,16 @@ void Filesystem::discardChanges() _sectors->discardChanges(); } -Filesystem::Filesystem(const std::shared_ptr& diskLayout, - std::shared_ptr sectors): +Filesystem::Filesystem(const DiskLayout* diskLayout, SectorInterface* sectors): _diskLayout(diskLayout), _blockCount(diskLayout->logicalSectorLocationsInFilesystemOrder.size()), _sectors(sectors) { } -std::unique_ptr Filesystem::createFilesystem( - const FilesystemProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr image) +Filesystem* Filesystem::createFilesystem(const FilesystemProto& config, + const DiskLayout* diskLayout, + SectorInterface* image) { switch (config.type()) { @@ -227,20 +226,20 @@ std::unique_ptr Filesystem::createFilesystem( default: error("no filesystem configured"); - return std::unique_ptr(); + return nullptr; } } -std::unique_ptr Filesystem::createFilesystemFromConfig() +Filesystem* Filesystem::createFilesystemFromConfig() { - std::shared_ptr sectorInterface; + SectorInterface* sectorInterface; auto diskLayout = createDiskLayout(globalConfig()); if (globalConfig().hasFluxSource() || globalConfig().hasFluxSink()) { - std::shared_ptr fluxSource; - std::shared_ptr decoder; - std::shared_ptr fluxSinkFactory; - std::shared_ptr encoder; + FluxSource* fluxSource = nullptr; + Decoder* decoder = nullptr; + FluxSinkFactory* fluxSinkFactory = nullptr; + Encoder* encoder = nullptr; if (globalConfig().hasFluxSource()) { fluxSource = FluxSource::create(globalConfig()); diff --git a/lib/vfs/vfs.h b/lib/vfs/vfs.h index 5b17ea21..9936db3b 100644 --- a/lib/vfs/vfs.h +++ b/lib/vfs/vfs.h @@ -225,8 +225,7 @@ class Filesystem void discardChanges(); public: - Filesystem(const std::shared_ptr& diskLayout, - std::shared_ptr sectors); + Filesystem(const DiskLayout* diskLayout, SectorInterface* sectors); virtual ~Filesystem() {}; Bytes getSector(unsigned track, unsigned side, unsigned sector); @@ -241,79 +240,63 @@ class Filesystem void eraseEverythingOnDisk(); protected: - const std::shared_ptr _diskLayout; + const DiskLayout* _diskLayout; unsigned _blockCount; private: - std::shared_ptr _sectors; + SectorInterface* _sectors; public: - static std::unique_ptr createBrother120Filesystem( - const FilesystemProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr image); - static std::unique_ptr createAcornDfsFilesystem( - const FilesystemProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr image); - static std::unique_ptr createFatFsFilesystem( - const FilesystemProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr image); - static std::unique_ptr createCpmFsFilesystem( - const FilesystemProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr image); - static std::unique_ptr createAmigaFfsFilesystem( - const FilesystemProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr image); - static std::unique_ptr createMacHfsFilesystem( - const FilesystemProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr image); - static std::unique_ptr createCbmfsFilesystem( - const FilesystemProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr image); - static std::unique_ptr createProdosFilesystem( - const FilesystemProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr image); - static std::unique_ptr createAppledosFilesystem( - const FilesystemProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr image); - static std::unique_ptr createSmaky6Filesystem( - const FilesystemProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr image); - static std::unique_ptr createPhileFilesystem( - const FilesystemProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr image); - static std::unique_ptr createLifFilesystem( - const FilesystemProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr image); - static std::unique_ptr createMicrodosFilesystem( - const FilesystemProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr image); - static std::unique_ptr createZDosFilesystem( - const FilesystemProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr image); - static std::unique_ptr createRolandFsFilesystem( - const FilesystemProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr image); - - static std::unique_ptr createFilesystem( - const FilesystemProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr image); - static std::unique_ptr createFilesystemFromConfig(); + static Filesystem* createBrother120Filesystem(const FilesystemProto& config, + const DiskLayout* diskLayout, + SectorInterface* image); + static Filesystem* createAcornDfsFilesystem(const FilesystemProto& config, + const DiskLayout* diskLayout, + SectorInterface* image); + static Filesystem* createFatFsFilesystem(const FilesystemProto& config, + const DiskLayout* diskLayout, + SectorInterface* image); + static Filesystem* createCpmFsFilesystem(const FilesystemProto& config, + const DiskLayout* diskLayout, + SectorInterface* image); + static Filesystem* createAmigaFfsFilesystem(const FilesystemProto& config, + const DiskLayout* diskLayout, + SectorInterface* image); + static Filesystem* createMacHfsFilesystem(const FilesystemProto& config, + const DiskLayout* diskLayout, + SectorInterface* image); + static Filesystem* createCbmfsFilesystem(const FilesystemProto& config, + const DiskLayout* diskLayout, + SectorInterface* image); + static Filesystem* createProdosFilesystem(const FilesystemProto& config, + const DiskLayout* diskLayout, + SectorInterface* image); + static Filesystem* createAppledosFilesystem(const FilesystemProto& config, + const DiskLayout* diskLayout, + SectorInterface* image); + static Filesystem* createSmaky6Filesystem(const FilesystemProto& config, + const DiskLayout* diskLayout, + SectorInterface* image); + static Filesystem* createPhileFilesystem(const FilesystemProto& config, + const DiskLayout* diskLayout, + SectorInterface* image); + static Filesystem* createLifFilesystem(const FilesystemProto& config, + const DiskLayout* diskLayout, + SectorInterface* image); + static Filesystem* createMicrodosFilesystem(const FilesystemProto& config, + const DiskLayout* diskLayout, + SectorInterface* image); + static Filesystem* createZDosFilesystem(const FilesystemProto& config, + const DiskLayout* diskLayout, + SectorInterface* image); + static Filesystem* createRolandFsFilesystem(const FilesystemProto& config, + const DiskLayout* diskLayout, + SectorInterface* image); + + static Filesystem* createFilesystem(const FilesystemProto& config, + const DiskLayout* diskLayout, + SectorInterface* image); + static Filesystem* createFilesystemFromConfig(); }; /* Used for tests only. */ diff --git a/lib/vfs/zdos.cc b/lib/vfs/zdos.cc index 07a7e59b..be06164e 100644 --- a/lib/vfs/zdos.cc +++ b/lib/vfs/zdos.cc @@ -183,8 +183,8 @@ class ZDosFilesystem : public Filesystem public: ZDosFilesystem(const ZDosProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr sectors): + const DiskLayout* diskLayout, + SectorInterface* sectors): Filesystem(diskLayout, sectors), _config(config) { @@ -320,10 +320,9 @@ class ZDosFilesystem : public Filesystem std::vector> _dirents; }; -std::unique_ptr Filesystem::createZDosFilesystem( - const FilesystemProto& config, - const std::shared_ptr& diskLayout, - std::shared_ptr sectors) +Filesystem* Filesystem::createZDosFilesystem(const FilesystemProto& config, + const DiskLayout* diskLayout, + SectorInterface* sectors) { - return std::make_unique(config.zdos(), diskLayout, sectors); + return new ZDosFilesystem(config.zdos(), diskLayout, sectors); } diff --git a/scripts/build.py b/scripts/build.py index 598ee4fa..c68de577 100644 --- a/scripts/build.py +++ b/scripts/build.py @@ -10,13 +10,14 @@ def protoencode_single(self, name, srcs: Targets, proto, include, symbol): r = cxxprogram( name="protoencode_" + proto, srcs=["scripts/protoencode.cc"], - cflags=["-DPROTO=" + proto, "-DINCLUDE="+include], + cflags=["-DPROTO=" + proto, "-DINCLUDE=" + include], deps=[ "lib/core", "lib/config+proto_lib", "lib/fluxsource+proto_lib", "lib/fluxsink+proto_lib", "tests+test_proto_lib", + "+gc_lib", "+protobuf_lib", "dep+fmt_lib", ], @@ -31,15 +32,13 @@ def protoencode_single(self, name, srcs: Targets, proto, include, symbol): ins=srcs, outs=[f"={name}.cc"], deps=[r], - commands=[ - "$[deps[0]] $[ins] $[outs] " + symbol - ], + commands=["$[deps[0]] $[ins] $[outs] " + symbol], label="PROTOENCODE", ) @Rule -def protoencode(self, name, proto, include,srcs: TargetsMap, symbol): +def protoencode(self, name, proto, include, srcs: TargetsMap, symbol): encoded = [ protoencode_single( name=f"{k}_cc", @@ -65,6 +64,7 @@ def protoencode(self, name, proto, include,srcs: TargetsMap, symbol): srcs=["./mkdoc.cc"], deps=[ "dep+fmt_lib", + "+gc_lib", "+protobuf_lib", "lib/algorithms", "lib/config+proto_lib", @@ -79,6 +79,7 @@ def protoencode(self, name, proto, include,srcs: TargetsMap, symbol): srcs=["./mkdocindex.cc"], deps=[ "dep+fmt_lib", + "+gc_lib", "+protobuf_lib", "lib/algorithms", "lib/config+proto_lib", diff --git a/scripts/protoencode.cc b/scripts/protoencode.cc index 83353294..f53a6f58 100644 --- a/scripts/protoencode.cc +++ b/scripts/protoencode.cc @@ -10,65 +10,29 @@ #include #include -void renderLogMessage( - LogRenderer& r, std::shared_ptr m) -{ -} +void renderLogMessage(LogRenderer& r, const BeginSpeedOperationLogMessage* m) {} -void renderLogMessage( - LogRenderer& r, std::shared_ptr m) -{ -} +void renderLogMessage(LogRenderer& r, const EndSpeedOperationLogMessage* m) {} -void renderLogMessage( - LogRenderer& r, std::shared_ptr m) -{ -} +void renderLogMessage(LogRenderer& r, const BeginWriteOperationLogMessage* m) {} -void renderLogMessage( - LogRenderer& r, std::shared_ptr m) -{ -} +void renderLogMessage(LogRenderer& r, const EndWriteOperationLogMessage* m) {} -void renderLogMessage( - LogRenderer& r, std::shared_ptr m) -{ -} +void renderLogMessage(LogRenderer& r, const BeginReadOperationLogMessage* m) {} -void renderLogMessage( - LogRenderer& r, std::shared_ptr m) -{ -} +void renderLogMessage(LogRenderer& r, const EndReadOperationLogMessage* m) {} -void renderLogMessage( - LogRenderer& r, std::shared_ptr m) -{ -} +void renderLogMessage(LogRenderer& r, const TrackReadLogMessage* m) {} -void renderLogMessage( - LogRenderer& r, std::shared_ptr m) -{ -} +void renderLogMessage(LogRenderer& r, const DiskReadLogMessage* m) {} -void renderLogMessage( - LogRenderer& r, std::shared_ptr m) -{ -} +void renderLogMessage(LogRenderer& r, const BeginOperationLogMessage* m) {} -void renderLogMessage( - LogRenderer& r, std::shared_ptr m) -{ -} +void renderLogMessage(LogRenderer& r, const EndOperationLogMessage* m) {} -void renderLogMessage( - LogRenderer& r, std::shared_ptr m) -{ -} +void renderLogMessage(LogRenderer& r, const OperationProgressLogMessage* m) {} -void renderLogMessage( - LogRenderer& r, std::shared_ptr m) -{ -} +void renderLogMessage(LogRenderer& r, const OptionLogMessage* m) {} const std::string protoname = STRINGIFY(PROTO); diff --git a/src/build.py b/src/build.py index 44732b07..da7955e5 100644 --- a/src/build.py +++ b/src/build.py @@ -36,6 +36,7 @@ ], cflags=["-I."], deps=[ + "+gc_lib", "+protobuf_lib", "+protocol", "+z_lib", diff --git a/src/fe-rawwrite.cc b/src/fe-rawwrite.cc index 317089b8..62517b12 100644 --- a/src/fe-rawwrite.cc +++ b/src/fe-rawwrite.cc @@ -54,6 +54,6 @@ int mainRawWrite(int argc, const char* argv[]) auto fluxSinkFactory = FluxSinkFactory::create(globalConfig()); auto diskLayout = createDiskLayout(globalConfig()); - writeRawDiskCommand(*diskLayout, *fluxSource, *fluxSinkFactory); + writeRawDiskCommand(*diskLayout, fluxSource, fluxSinkFactory); return 0; } diff --git a/src/fe-read.cc b/src/fe-read.cc index ee53c86b..aa6d0a86 100644 --- a/src/fe-read.cc +++ b/src/fe-read.cc @@ -56,7 +56,7 @@ int mainRead(int argc, const char* argv[]) auto decoder = Arch::createDecoder(globalConfig()); auto writer = ImageWriter::create(globalConfig()); - readDiskCommand(*diskLayout, *fluxSource, *decoder, *writer); + readDiskCommand(*diskLayout, fluxSource, decoder, *writer); return 0; } diff --git a/src/fe-write.cc b/src/fe-write.cc index f69713b3..3c3d42c4 100644 --- a/src/fe-write.cc +++ b/src/fe-write.cc @@ -53,15 +53,15 @@ int mainWrite(int argc, const char* argv[]) flags.parseFlagsWithConfigFiles(argc, argv, formats); auto reader = ImageReader::create(globalConfig()); - std::shared_ptr image = reader->readImage(); + Image* image = reader->readImage(); globalConfig().overrides()->MergeFrom(reader->getExtraConfig()); auto diskLayout = createDiskLayout(); auto encoder = Arch::createEncoder(globalConfig()); auto fluxSinkFactory = FluxSinkFactory::create(globalConfig()); - std::shared_ptr decoder; - std::shared_ptr verificationFluxSource; + Decoder* decoder = nullptr; + FluxSource* verificationFluxSource = nullptr; if (globalConfig().hasDecoder() && fluxSinkFactory->isHardware() && verify) { decoder = Arch::createDecoder(globalConfig()); @@ -71,10 +71,10 @@ int mainWrite(int argc, const char* argv[]) writeDiskCommand(*diskLayout, *image, - *encoder, - *fluxSinkFactory, - decoder.get(), - verificationFluxSource.get()); + encoder, + fluxSinkFactory, + decoder, + verificationFluxSource); return 0; } diff --git a/src/gui/browserpanel.cc b/src/gui/browserpanel.cc index 3f16d516..deeadee9 100644 --- a/src/gui/browserpanel.cc +++ b/src/gui/browserpanel.cc @@ -679,7 +679,7 @@ class BrowserPanelImpl : public BrowserPanelGen, public BrowserPanel, JobQueue private: int _state = STATE_DEAD; - std::unique_ptr _filesystem; + Filesystem* _filesystem; uint32_t _filesystemCapabilities; bool _filesystemIsReadOnly; bool _filesystemNeedsFlushing; diff --git a/src/gui/context.cc b/src/gui/context.cc index 8dbcbd4d..6a08c8a2 100644 --- a/src/gui/context.cc +++ b/src/gui/context.cc @@ -21,7 +21,7 @@ namespace { _fluxSource = FluxSource::create(globalConfig()); } - return _fluxSource.get(); + return _fluxSource->get(); } FluxSource* GetVerificationFluxSource() override @@ -31,7 +31,7 @@ namespace _verificationFluxSource = FluxSource::create( globalConfig().getVerificationFluxSourceProto()); } - return _verificationFluxSource.get(); + return _verificationfluxSource->get(); } FluxSinkFactory* GetFluxSink() override @@ -80,13 +80,13 @@ namespace } private: - std::unique_ptr _fluxSource; - std::unique_ptr _verificationFluxSource; - std::unique_ptr _fluxSink; + FluxSource* _fluxSource; + FluxSource* _verificationFluxSource; + FluxSinkFactory* _fluxSink; std::unique_ptr _imageReader; std::unique_ptr _imageWriter; - std::unique_ptr _encoder; - std::unique_ptr _decoder; + Encoder* _encoder; + Decoder* _decoder; }; } diff --git a/src/gui/fluxviewercontrol.cc b/src/gui/fluxviewercontrol.cc index de649a51..f83e413a 100644 --- a/src/gui/fluxviewercontrol.cc +++ b/src/gui/fluxviewercontrol.cc @@ -552,7 +552,7 @@ void FluxViewerControl::OnContextMenu(wxContextMenuEvent& event) Refresh(); } -void FluxViewerControl::ShowSectorMenu(std::shared_ptr sector) +void FluxViewerControl::ShowSectorMenu(const Sector* sector) { wxMenu menu; @@ -601,8 +601,7 @@ void FluxViewerControl::ShowRecordMenu(std::shared_ptr& layout, PopupMenu(&menu, _mouseX, _mouseY); } -static void dumpSectorMetadata( - std::ostream& s, std::shared_ptr sector) +static void dumpSectorMetadata(std::ostream& s, const Sector* sector) { s << fmt::format( "Sector status: {}\n", Sector::statusToString(sector->status)) @@ -629,7 +628,7 @@ static void dumpRecordMetadata( "Data CRC16: {:4x}\n", crc16(CCITT_POLY, record->rawData)); } -void FluxViewerControl::DisplayDecodedData(std::shared_ptr sector) +void FluxViewerControl::DisplayDecodedData(const Sector* sector) { std::stringstream s; @@ -646,8 +645,7 @@ void FluxViewerControl::DisplayDecodedData(std::shared_ptr sector) TextViewerWindow::Create(this, title, s.str())->Show(); } -void FluxViewerControl::DisplaySectorSummary( - std::shared_ptr sector) +void FluxViewerControl::DisplaySectorSummary(const Sector* sector) { std::stringstream s; @@ -657,7 +655,7 @@ void FluxViewerControl::DisplaySectorSummary( sector->logicalSector); s << title << '\n'; - std::vector> sectors; + std::vector sectors; for (auto& trackdata : _flux->trackDatas) { if ((trackdata->trackInfo->logicalCylinder == @@ -685,7 +683,7 @@ void FluxViewerControl::DisplaySectorSummary( TextViewerWindow::Create(this, title, s.str())->Show(); } -void FluxViewerControl::DisplayRawData(std::shared_ptr sector) +void FluxViewerControl::DisplayRawData(const Sector* sector) { std::stringstream s; diff --git a/src/gui/fluxviewercontrol.h b/src/gui/fluxviewercontrol.h index bc1c2e33..6e591937 100644 --- a/src/gui/fluxviewercontrol.h +++ b/src/gui/fluxviewercontrol.h @@ -26,12 +26,12 @@ class FluxViewerControl : public wxWindow private: void UpdateScale(); - void ShowSectorMenu(std::shared_ptr sector); + void ShowSectorMenu(const Sector* sector); void ShowRecordMenu(std::shared_ptr& layout, std::shared_ptr record); - void DisplayDecodedData(std::shared_ptr sector); - void DisplaySectorSummary(std::shared_ptr sector); - void DisplayRawData(std::shared_ptr sector); + void DisplayDecodedData(const Sector* sector); + void DisplaySectorSummary(const Sector* sector); + void DisplayRawData(const Sector* sector); void DisplayRawData(std::shared_ptr& layout, std::shared_ptr record); diff --git a/src/gui/imagerpanel.cc b/src/gui/imagerpanel.cc index 429d0b45..a5e7072f 100644 --- a/src/gui/imagerpanel.cc +++ b/src/gui/imagerpanel.cc @@ -96,7 +96,7 @@ class ImagerPanelImpl : public ImagerPanelGen, public ImagerPanel, JobQueue { auto* fluxSource = GetContext().GetFluxSource(); auto* decoder = GetContext().GetDecoder(); - auto disk = readDiskCommand(*fluxSource, *decoder); + auto disk = readDiskCommand(*fluxSource, decoder); runOnUiThread( [&]() @@ -156,7 +156,7 @@ class ImagerPanelImpl : public ImagerPanelGen, public ImagerPanel, JobQueue } writeDiskCommand(*image, - *encoder, + encoder, *fluxSinkFactory, decoder, verificationFluxSource); diff --git a/src/gui/mainwindow.cc b/src/gui/mainwindow.cc index 6bf48813..48a8811f 100644 --- a/src/gui/mainwindow.cc +++ b/src/gui/mainwindow.cc @@ -65,7 +65,7 @@ class MainWindowImpl : public MainWindowGen, public MainWindow _logRenderer(LogRenderer::create(_logStream)) { Logger::setLogger( - [&](const AnyLogMessage& message) + [&](const AnyLogMessage* message) { if (isWorkerThread()) { @@ -233,7 +233,7 @@ class MainWindowImpl : public MainWindowGen, public MainWindow ShowConfig(); } - void OnLogMessage(const AnyLogMessage& message) + void OnLogMessage(const AnyLogMessage* message) { _logRenderer->add(message); _logStream.flush(); @@ -246,7 +246,7 @@ class MainWindowImpl : public MainWindowGen, public MainWindow }, /* We terminated due to the stop button. */ - [&](std::shared_ptr m) + [&](const EmergencyStopMessage* m) { _statusBar->SetLeftLabel("Emergency stop!"); _statusBar->HideProgressBar(); @@ -254,7 +254,7 @@ class MainWindowImpl : public MainWindowGen, public MainWindow }, /* A fatal error. */ - [&](std::shared_ptr m) + [&](const ErrorLogMessage* m) { _statusBar->SetLeftLabel(m->message); wxMessageBox(m->message, "Error", wxOK | wxICON_ERROR); @@ -263,7 +263,7 @@ class MainWindowImpl : public MainWindowGen, public MainWindow }, /* Indicates that we're starting a write operation. */ - [&](std::shared_ptr m) + [&](const BeginWriteOperationLogMessage* m) { _statusBar->SetRightLabel( fmt::format("W {}.{}", m->track, m->head)); @@ -271,14 +271,14 @@ class MainWindowImpl : public MainWindowGen, public MainWindow m->track, m->head, VISMODE_WRITING); }, - [&](std::shared_ptr m) + [&](const EndWriteOperationLogMessage* m) { _statusBar->SetRightLabel(""); _imagerPanel->SetVisualiserMode(0, 0, VISMODE_NOTHING); }, /* Indicates that we're starting a read operation. */ - [&](std::shared_ptr m) + [&](const BeginReadOperationLogMessage* m) { _statusBar->SetRightLabel( fmt::format("R {}.{}", m->track, m->head)); @@ -286,38 +286,38 @@ class MainWindowImpl : public MainWindowGen, public MainWindow m->track, m->head, VISMODE_READING); }, - [&](std::shared_ptr m) + [&](const EndReadOperationLogMessage* m) { _statusBar->SetRightLabel(""); _imagerPanel->SetVisualiserMode(0, 0, VISMODE_NOTHING); }, - [&](std::shared_ptr m) + [&](const TrackReadLogMessage* m) { _imagerPanel->SetVisualiserTrackData(m->track); }, - [&](std::shared_ptr m) + [&](const DiskReadLogMessage* m) { _imagerPanel->SetDisk(m->disk); }, /* Large-scale operation start. */ - [&](std::shared_ptr m) + [&](const BeginOperationLogMessage* m) { _statusBar->SetLeftLabel(m->message); _statusBar->ShowProgressBar(); }, /* Large-scale operation end. */ - [&](std::shared_ptr m) + [&](const EndOperationLogMessage* m) { _statusBar->SetLeftLabel(m->message); _statusBar->HideProgressBar(); }, /* Large-scale operation progress. */ - [&](std::shared_ptr m) + [&](const OperationProgressLogMessage* m) { _statusBar->SetProgress(m->progress); }, diff --git a/src/gui/visualisationcontrol.cc b/src/gui/visualisationcontrol.cc index 56261284..f4c28ae7 100644 --- a/src/gui/visualisationcontrol.cc +++ b/src/gui/visualisationcontrol.cc @@ -104,7 +104,7 @@ void VisualisationControl::OnPaint(wxPaintEvent&) auto drawSectors = [&](int head) { key_t key = {track, head}; - std::vector> sectors; + std::vector sectors; for (auto it = _sectors.lower_bound(key); it != _sectors.upper_bound(key); it++) diff --git a/src/gui/visualisationcontrol.h b/src/gui/visualisationcontrol.h index b15d64e0..6d38e464 100644 --- a/src/gui/visualisationcontrol.h +++ b/src/gui/visualisationcontrol.h @@ -63,7 +63,7 @@ class VisualisationControl : public wxWindow int _mode = VISMODE_NOTHING; int _selectedHead = -1; int _selectedTrack = -1; - std::multimap> _sectors; + std::multimap _sectors; std::map> _tracks; wxDECLARE_EVENT_TABLE(); }; diff --git a/src/gui2/abstractsectorview.h b/src/gui2/abstractsectorview.h index 6d83d784..4bc5ed48 100644 --- a/src/gui2/abstractsectorview.h +++ b/src/gui2/abstractsectorview.h @@ -23,7 +23,7 @@ class AbstractSectorView : public hex::View::Window } protected: - virtual std::shared_ptr getSector( + virtual const Sector* getSector( unsigned cylinder, unsigned head, unsigned sectorId) = 0; virtual DiskLayout::LayoutBounds getBounds() = 0; }; diff --git a/src/gui2/build.py b/src/gui2/build.py index 94435f48..3e507063 100644 --- a/src/gui2/build.py +++ b/src/gui2/build.py @@ -687,6 +687,7 @@ def plugin(name, id, srcs, hdrs, romfsdir, deps): hdrs={}, romfsdir="src/gui2/rsrc", deps=[ + "+gc_lib", "+protocol", "+z_lib", ".+fonts-plugin", @@ -714,13 +715,13 @@ def plugin(name, id, srcs, hdrs, romfsdir, deps): + (["-ldl"] if config.unix else []) + (["-ldwmapi", "-lnetapi32"] if config.windows else []), deps=[ - "dep+patternlanguage_lib", - "dep+fmt_lib", ".+builtin-plugin", + ".+fluxengine-plugin", ".+fonts-plugin", - ".+ui-plugin", ".+gui-plugin", - ".+fluxengine-plugin", + ".+ui-plugin", + "dep+fmt_lib", + "dep+patternlanguage_lib", ] # Windows needs this, for some reason. + (config.windows and [package(name="tre_lib", package="tre")] or []), diff --git a/src/gui2/datastore.cc b/src/gui2/datastore.cc index cc340531..26e5b948 100644 --- a/src/gui2/datastore.cc +++ b/src/gui2/datastore.cc @@ -36,7 +36,7 @@ using hex::operator""_lang; static std::shared_ptr disk = std::make_shared(); -static std::shared_ptr wtImage; +static Image* wtImage; static std::deque> pendingTasks; static std::mutex pendingTasksMutex; @@ -49,7 +49,7 @@ static std::atomic failed; static bool formattingSupported; static std::map devices; -static std::shared_ptr diskLayout; +static const DiskLayout* diskLayout; static void wtRebuildConfiguration(bool useCustom); @@ -212,7 +212,7 @@ void Datastore::init() [] { Logger::setLogger( - [](const AnyLogMessage& message) + [](const AnyLogMessage* message) { hex::TaskManager::doLater( [=] @@ -294,7 +294,7 @@ const std::map& Datastore::getDevices() return devices; } -std::shared_ptr Datastore::getDiskLayout() +const DiskLayout* Datastore::getDiskLayout() { return diskLayout; } @@ -432,7 +432,7 @@ void wtRebuildConfiguration(bool withCustom = false) }); } -void Datastore::onLogMessage(const AnyLogMessage& message) +void Datastore::onLogMessage(const AnyLogMessage* message) { LogView::logMessage(message); std::visit( @@ -443,48 +443,48 @@ void Datastore::onLogMessage(const AnyLogMessage& message) }, /* We terminated due to the stop button. */ - [&](std::shared_ptr m) + [&](const EmergencyStopMessage* m) { }, /* A fatal error. */ - [&](std::shared_ptr m) + [&](const ErrorLogMessage* m) { hex::ui::ToastError::open(m->message); }, /* Indicates that we're starting a write operation. */ - [&](std::shared_ptr m) + [&](const BeginWriteOperationLogMessage* m) { Events::DiskActivityNotification::post( DiskActivityType::Write, m->track, m->head); }, - [&](std::shared_ptr m) + [&](const EndWriteOperationLogMessage* m) { Events::DiskActivityNotification::post( DiskActivityType::None, 0, 0); }, /* Indicates that we're starting a read operation. */ - [&](std::shared_ptr m) + [&](const BeginReadOperationLogMessage* m) { Events::DiskActivityNotification::post( DiskActivityType::Read, m->track, m->head); }, - [&](std::shared_ptr m) + [&](const EndReadOperationLogMessage* m) { Events::DiskActivityNotification::post( DiskActivityType::None, 0, 0); }, - [&](std::shared_ptr m) + [&](const TrackReadLogMessage* m) { // _imagerPanel->SetVisualiserTrackData(m->track); }, - [&](std::shared_ptr m) + [&](const DiskReadLogMessage* m) { /* This is where data gets from the worker thread to the GUI. * The disk here is a copy of the one being worked on, and @@ -494,27 +494,27 @@ void Datastore::onLogMessage(const AnyLogMessage& message) }, /* Large-scale operation start. */ - [&](std::shared_ptr m) + [&](const BeginOperationLogMessage* m) { // _statusBar->SetLeftLabel(m->message); // _statusBar->ShowProgressBar(); }, /* Large-scale operation end. */ - [&](std::shared_ptr m) + [&](const EndOperationLogMessage* m) { // _statusBar->SetLeftLabel(m->message); // _statusBar->HideProgressBar(); }, /* Large-scale operation progress. */ - [&](std::shared_ptr m) + [&](const OperationProgressLogMessage* m) { // _statusBar->SetProgress(m->progress); }, }, - message); + *message); } void Datastore::beginRead(bool rereadBadSectors) @@ -534,16 +534,17 @@ void Datastore::beginRead(bool rereadBadSectors) wtClearDiskData(); std::shared_ptr disk; - wtRunSynchronouslyOnUiThread((std::function)[&] { - if (::disk) - disk = std::make_shared(*::disk); - else - disk = std::make_shared(); - }); + wtRunSynchronouslyOnUiThread((std::function)[&] + { + if (::disk) + disk = std::make_shared(*::disk); + else + disk = std::make_shared(); + }); auto fluxSource = FluxSource::create(globalConfig()); auto decoder = Arch::createDecoder(globalConfig()); - readDiskCommand(*diskLayout, *fluxSource, *decoder, *disk); + readDiskCommand(*diskLayout, fluxSource, decoder, *disk); } catch (...) { @@ -570,8 +571,8 @@ void Datastore::beginWrite() auto fluxSinkFactory = FluxSinkFactory::create(globalConfig()); auto encoder = Arch::createEncoder(globalConfig()); - std::shared_ptr decoder; - std::shared_ptr verificationFluxSource; + Decoder* decoder; + FluxSource* verificationFluxSource; if (globalConfig().hasDecoder() && fluxSinkFactory->isHardware()) { @@ -585,19 +586,19 @@ void Datastore::beginWrite() { { bool result; - wtRunSynchronouslyOnUiThread(( - std::function)[&] { - hex::ui::PopupQuestion::open( - "fluxengine.messages.writingFluxToFile"_lang, - [&] - { - result = true; - }, - [&] - { - result = false; - }); - }); + wtRunSynchronouslyOnUiThread((std::function)[&] + { + hex::ui::PopupQuestion::open( + "fluxengine.messages.writingFluxToFile"_lang, + [&] + { + result = true; + }, + [&] + { + result = false; + }); + }); if (!result) throw EmergencyStopException(); } @@ -606,10 +607,10 @@ void Datastore::beginWrite() auto image = disk->image; writeDiskCommand(*diskLayout, *image, - *encoder, - *fluxSinkFactory, - decoder.get(), - verificationFluxSource.get()); + encoder, + fluxSinkFactory, + decoder, + verificationFluxSource); } catch (...) { @@ -648,8 +649,7 @@ void Datastore::stop() emergencyStop = true; } -static std::shared_ptr wtMakeDiskDataFromImage( - std::shared_ptr& image) +static std::shared_ptr wtMakeDiskDataFromImage(Image* image) { image->calculateSize(); image->populateSectorPhysicalLocationsFromLogicalLocations(*diskLayout); @@ -701,7 +701,7 @@ void Datastore::readImage(const std::fs::path& path) wtWaitForUiThreadToCatchUp(); globalConfig().setImageReader(path.string()); auto imageReader = ImageReader::create(globalConfig()); - std::shared_ptr image = imageReader->readImage(); + Image* image = imageReader->readImage(); const auto& extraConfig = imageReader->getExtraConfig(); auto customConfig = renderProtoAsConfig(&extraConfig); @@ -709,9 +709,10 @@ void Datastore::readImage(const std::fs::path& path) /* Update the setting, and then rebuild the config again as it * will have changed. */ - wtRunSynchronouslyOnUiThread((std::function)[=] { - Events::SetSystemConfig::post(customConfig); - }); + wtRunSynchronouslyOnUiThread((std::function)[=] + { + Events::SetSystemConfig::post(customConfig); + }); wtRebuildConfiguration(true); wtWaitForUiThreadToCatchUp(); @@ -756,7 +757,7 @@ void Datastore::writeFluxFile(const std::fs::path& path) globalConfig().setFluxSink(path.string()); auto fluxSource = FluxSource::createMemoryFluxSource(*disk); auto fluxSinkFactory = FluxSinkFactory::create(globalConfig()); - writeRawDiskCommand(*diskLayout, *fluxSource, *fluxSinkFactory); + writeRawDiskCommand(*diskLayout, fluxSource, fluxSinkFactory); } catch (...) { @@ -782,8 +783,8 @@ void Datastore::createBlankImage() wtClearDiskData(); wtWaitForUiThreadToCatchUp(); - auto image = std::make_shared(); - std::shared_ptr sectorInterface = + auto image = new Image(); + SectorInterface* sectorInterface = SectorInterface::createMemorySectorInterface(image); auto filesystem = Filesystem::createFilesystem( globalConfig()->filesystem(), diskLayout, sectorInterface); diff --git a/src/gui2/datastore.h b/src/gui2/datastore.h index fc74706b..55b07bd3 100644 --- a/src/gui2/datastore.h +++ b/src/gui2/datastore.h @@ -30,8 +30,8 @@ class Datastore static const std::map& getDevices(); static const std::map>& getPhysicalCylinderLayouts(); - static std::shared_ptr getDiskLayout(); - static void onLogMessage(const AnyLogMessage& message); + static const DiskLayout* getDiskLayout(); + static void onLogMessage(const AnyLogMessage* message); static void reset(); static void beginRead(bool rereadBadSectors); diff --git a/src/gui2/imageview.cc b/src/gui2/imageview.cc index ab8556c9..6e92930a 100644 --- a/src/gui2/imageview.cc +++ b/src/gui2/imageview.cc @@ -17,7 +17,7 @@ DiskLayout::LayoutBounds ImageView::getBounds() return Datastore::getDiskLayout()->getLogicalBounds(); } -std::shared_ptr ImageView::getSector( +const Sector* ImageView::getSector( unsigned logicalCylinder, unsigned logicalHead, unsigned sectorId) { auto disk = Datastore::getDisk(); diff --git a/src/gui2/imageview.h b/src/gui2/imageview.h index d7c618e4..c87c756d 100644 --- a/src/gui2/imageview.h +++ b/src/gui2/imageview.h @@ -8,7 +8,7 @@ class ImageView : public AbstractSectorView public: ImageView(); - std::shared_ptr getSector( + const Sector* getSector( unsigned cylinder, unsigned head, unsigned sectorId) override; DiskLayout::LayoutBounds getBounds() override; }; diff --git a/src/gui2/logview.cc b/src/gui2/logview.cc index b7ff2c3e..ae87287c 100644 --- a/src/gui2/logview.cc +++ b/src/gui2/logview.cc @@ -61,7 +61,7 @@ void LogView::drawContent() } } -void LogView::logMessage(const AnyLogMessage& message) +void LogView::logMessage(const AnyLogMessage* message) { logRenderer->add(message); scrollToEndOnNextRedraw = true; diff --git a/src/gui2/logview.h b/src/gui2/logview.h index 25ca56b9..a03722b9 100644 --- a/src/gui2/logview.h +++ b/src/gui2/logview.h @@ -10,7 +10,7 @@ class LogView : public hex::View::Window ~LogView() override = default; void drawContent() override; - static void logMessage(const AnyLogMessage& message); + static void logMessage(const AnyLogMessage* message); [[nodiscard]] bool shouldDraw() const override { diff --git a/src/gui2/physicalview.cc b/src/gui2/physicalview.cc index 43e7a512..d6e7a082 100644 --- a/src/gui2/physicalview.cc +++ b/src/gui2/physicalview.cc @@ -22,7 +22,7 @@ DiskLayout::LayoutBounds PhysicalView::getBounds() return Datastore::getDiskLayout()->getPhysicalBounds(); } -std::shared_ptr PhysicalView::getSector( +const Sector* PhysicalView::getSector( unsigned physicalCylinder, unsigned physicalHead, unsigned sectorId) { const auto& disk = Datastore::getDisk(); diff --git a/src/gui2/physicalview.h b/src/gui2/physicalview.h index fb839228..c23ad77a 100644 --- a/src/gui2/physicalview.h +++ b/src/gui2/physicalview.h @@ -9,7 +9,7 @@ class PhysicalView : public AbstractSectorView PhysicalView(); ~PhysicalView(); - std::shared_ptr getSector( + const Sector* getSector( unsigned cylinder, unsigned head, unsigned sectorId) override; DiskLayout::LayoutBounds getBounds() override; }; diff --git a/src/gui2/summaryview.cc b/src/gui2/summaryview.cc index e832b5e5..564380c9 100644 --- a/src/gui2/summaryview.cc +++ b/src/gui2/summaryview.cc @@ -37,7 +37,7 @@ static std::string getActivityLabel(DiskActivityType type) case DiskActivityType::Write: return "W"; } - throw std::invalid_argument("bad argument"); + throw std::invalid_argument("bad argument"); } SummaryView::SummaryView(): @@ -65,10 +65,10 @@ SummaryView::SummaryView(): }); } -static std::set> findSectors( +static std::set findSectors( const Disk& disk, unsigned physicalCylinder, unsigned physicalHead) { - std::set> sectors; + std::set sectors; auto [startIt, endIt] = disk.sectorsByPhysicalLocation.equal_range( {physicalCylinder, physicalHead}); diff --git a/tests/build.py b/tests/build.py index 0a51400a..d2f96fa8 100644 --- a/tests/build.py +++ b/tests/build.py @@ -4,7 +4,6 @@ from build.utils import test from scripts.build import protoencode_single - proto( name="test_proto", srcs=["./testproto.proto"], @@ -61,6 +60,7 @@ ], deps=[ "dep+fmt_lib", + "+gc_lib", "+protobuf_lib", "+protocol", ".+test_proto_lib", @@ -86,6 +86,7 @@ deps=[ "lib/external+fl2_proto_lib", "dep+fmt_lib", + "+gc_lib", "+protobuf_lib", "+protocol", "+z_lib", diff --git a/tests/cpmfs.cc b/tests/cpmfs.cc index 48a11181..c96c6833 100644 --- a/tests/cpmfs.cc +++ b/tests/cpmfs.cc @@ -16,8 +16,7 @@ static Bytes blank_dirent = Bytes{0xe5} * 32; /* The layout must use one cylinder per CP/M block (eight sectors). */ -static std::shared_ptr diskLayout = - std::make_shared(10, 1, 8, 256); +static const DiskLayout* diskLayout = new DiskLayout(10, 1, 8, 256); namespace { @@ -29,7 +28,7 @@ namespace _image.addMissingSectors(*diskLayout, true); } - std::shared_ptr get( + const Sector* get( unsigned track, unsigned side, unsigned sectorId) override { auto s = _image.get(track, side, sectorId); @@ -38,8 +37,7 @@ namespace return s; } - std::shared_ptr put( - unsigned track, unsigned side, unsigned sectorId) override + Sector* put(unsigned track, unsigned side, unsigned sectorId) override { return _image.put(track, side, sectorId); } @@ -110,15 +108,13 @@ static Bytes createDirent(const std::string& filename, return dirent; } -static void setBlock( - const std::shared_ptr& sectors, int block, Bytes data) +static void setBlock(SectorInterface* sectors, int block, Bytes data) { for (int i = 0; i < 8; i++) sectors->put(block, 0, i)->data = data.slice(i * 256, 256); } -static Bytes getBlock( - const std::shared_ptr& sectors, int block, int length) +static Bytes getBlock(SectorInterface* sectors, int block, int length) { Bytes bytes; ByteWriter bw(bytes); @@ -134,7 +130,7 @@ static Bytes getBlock( static void testPartialExtent() { - auto sectors = std::make_shared(); + auto sectors = new TestSectorInterface(); auto fs = Filesystem::createCpmFsFilesystem( globalConfig()->filesystem(), diskLayout, sectors); @@ -154,7 +150,7 @@ static void testPartialExtent() static void testLogicalExtents() { - auto sectors = std::make_shared(); + auto sectors = new TestSectorInterface(); auto fs = Filesystem::createCpmFsFilesystem( globalConfig()->filesystem(), diskLayout, sectors); @@ -178,7 +174,7 @@ static void testLogicalExtents() static void testBitmap() { - auto sectors = std::make_shared(); + auto sectors = new TestSectorInterface(); auto fs = Filesystem::createCpmFsFilesystem( globalConfig()->filesystem(), diskLayout, sectors); @@ -187,9 +183,9 @@ static void testBitmap() createDirent("FILE", 1, 128, {1, 0, 0, 0, 0, 0, 0, 0, 2}) + createDirent("FILE", 2, 128, {4}) + (blank_dirent * 62)); - dynamic_cast(fs.get())->mount(); + dynamic_cast(fs)->mount(); std::vector bitmap = - dynamic_cast(fs.get())->getBitmapForDebugging(); + dynamic_cast(fs)->getBitmapForDebugging(); AssertThat(bitmap, Equals(std::vector{ 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0})); diff --git a/tests/docker/Dockerfile.debian12 b/tests/docker/Dockerfile.debian12 index 3e57059e..d217ddac 100644 --- a/tests/docker/Dockerfile.debian12 +++ b/tests/docker/Dockerfile.debian12 @@ -8,7 +8,7 @@ RUN apt install -y python3 make xz-utils python3 python3-hamcrest \ libfreetype-dev libglfw3-dev libboost-regex-dev \ nlohmann-json3-dev libmd4c-dev libdbus-1-dev \ libcurl4-openssl-dev libmagic-dev libmbedtls-dev \ - git + libgc-dev git RUN useradd app RUN mkdir -p /home/app diff --git a/tests/docker/Dockerfile.debian13 b/tests/docker/Dockerfile.debian13 index ba6d6eef..afae4c5b 100644 --- a/tests/docker/Dockerfile.debian13 +++ b/tests/docker/Dockerfile.debian13 @@ -8,7 +8,7 @@ RUN apt install -y python3 make xz-utils python3 python3-hamcrest \ libfreetype-dev libglfw3-dev libboost-regex-dev \ nlohmann-json3-dev libmd4c-dev libdbus-1-dev \ libcurl4-openssl-dev libmagic-dev libmbedtls-dev \ - git + libgc-dev git RUN useradd app RUN mkdir -p /home/app diff --git a/tests/docker/Dockerfile.fedora40 b/tests/docker/Dockerfile.fedora40 deleted file mode 100644 index c20ba2d2..00000000 --- a/tests/docker/Dockerfile.fedora40 +++ /dev/null @@ -1,34 +0,0 @@ -FROM fedora:40 - -RUN dnf update -y -RUN dnf -y install https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-40.noarch.rpm -RUN dnf -y install https://github.com/rpmsphere/noarch/raw/master/r/rpmsphere-release-40-1.noarch.rpm -RUN dnf -y install \ - protobuf-compiler protobuf-devel sqlite-devel libudev-devel \ - wxGTK-devel gcc gcc-c++ fmt-devel png2ico ninja-build glfw-devel \ - libcurl-devel file-devel mbedtls-devel cli11-devel \ - lunasvg-devel md4c-devel boost-devel git - -RUN useradd app -RUN mkdir -p /home/app -RUN chown app /home/app -USER app -WORKDIR /home/app - -COPY --chown=app:app arch arch -COPY --chown=app:app build build -COPY --chown=app:app dep dep -COPY --chown=app:app doc doc -COPY --chown=app:app extras extras -COPY --chown=app:app lib lib -COPY --chown=app:app scripts scripts -COPY --chown=app:app src src -COPY --chown=app:app tests tests -COPY --chown=app:app tools tools -COPY --chown=app:app Makefile . -COPY --chown=app:app build.py . -COPY --chown=app:app config.py . -COPY --chown=app:app protocol.h . -COPY --chown=app:app README.md . - -RUN make diff --git a/tests/docker/Dockerfile.fedora41 b/tests/docker/Dockerfile.fedora41 deleted file mode 100644 index 89c5d4d3..00000000 --- a/tests/docker/Dockerfile.fedora41 +++ /dev/null @@ -1,34 +0,0 @@ -FROM fedora:41 - -RUN dnf update -y -RUN dnf -y install https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-41.noarch.rpm -RUN dnf -y install https://github.com/rpmsphere/noarch/raw/master/r/rpmsphere-release-40-1.noarch.rpm -RUN dnf -y install \ - protobuf-compiler protobuf-devel sqlite-devel libudev-devel \ - wxGTK-devel gcc gcc-c++ fmt-devel png2ico ninja-build glfw-devel \ - libcurl-devel file-devel mbedtls-devel cli11-devel \ - lunasvg-devel md4c-devel boost-devel git - -RUN useradd app -RUN mkdir -p /home/app -RUN chown app /home/app -USER app -WORKDIR /home/app - -COPY --chown=app:app arch arch -COPY --chown=app:app build build -COPY --chown=app:app dep dep -COPY --chown=app:app doc doc -COPY --chown=app:app extras extras -COPY --chown=app:app lib lib -COPY --chown=app:app scripts scripts -COPY --chown=app:app src src -COPY --chown=app:app tests tests -COPY --chown=app:app tools tools -COPY --chown=app:app Makefile . -COPY --chown=app:app build.py . -COPY --chown=app:app config.py . -COPY --chown=app:app protocol.h . -COPY --chown=app:app README.md . - -RUN make diff --git a/tests/docker/Dockerfile.fedora42 b/tests/docker/Dockerfile.fedora42 index 7ebf60bc..9919f40c 100644 --- a/tests/docker/Dockerfile.fedora42 +++ b/tests/docker/Dockerfile.fedora42 @@ -6,7 +6,7 @@ RUN dnf -y install \ protobuf-compiler protobuf-devel sqlite-devel libudev-devel \ wxGTK-devel gcc gcc-c++ fmt-devel ninja-build glfw-devel \ libcurl-devel file-devel mbedtls-devel cli11-devel \ - lunasvg-devel md4c-devel boost-devel git + lunasvg-devel md4c-devel boost-devel git gc-devel RUN useradd app RUN mkdir -p /home/app diff --git a/tests/docker/Dockerfile.fedora43 b/tests/docker/Dockerfile.fedora43 index 20aacdf7..91f59488 100644 --- a/tests/docker/Dockerfile.fedora43 +++ b/tests/docker/Dockerfile.fedora43 @@ -6,7 +6,7 @@ RUN dnf -y install \ protobuf-compiler protobuf-devel sqlite-devel libudev-devel \ wxGTK-devel gcc gcc-c++ fmt-devel ninja-build glfw-devel \ libcurl-devel file-devel mbedtls-devel cli11-devel \ - lunasvg-devel md4c-devel boost-devel git + lunasvg-devel md4c-devel boost-devel git gc-devel RUN useradd app RUN mkdir -p /home/app diff --git a/tests/docker/Dockerfile.fedora43.nooptionaldeps b/tests/docker/Dockerfile.fedora43.nooptionaldeps index 1c3599ab..28611436 100644 --- a/tests/docker/Dockerfile.fedora43.nooptionaldeps +++ b/tests/docker/Dockerfile.fedora43.nooptionaldeps @@ -6,7 +6,7 @@ RUN dnf -y install \ protobuf-compiler protobuf-devel sqlite-devel libudev-devel \ wxGTK-devel gcc gcc-c++ ninja-build glfw-devel \ libcurl-devel file-devel mbedtls-devel \ - boost-devel git + boost-devel git gc-devel RUN useradd app RUN mkdir -p /home/app diff --git a/tools/build.py b/tools/build.py index 156a7ea7..a2efcba2 100644 --- a/tools/build.py +++ b/tools/build.py @@ -9,14 +9,15 @@ name="brother120tool", srcs=["./brother120tool.cc"], deps=[ - "dep+fmt_lib", + "+gc_lib", "+protobuf_lib", "+z_lib", + "dep+fmt_lib", + "lib/algorithms", "lib/config", "lib/core", "lib/data", "lib/fluxsource+proto_lib", - "lib/algorithms", "src/formats", ] + emu, @@ -27,6 +28,7 @@ srcs=["./brother240tool.cc"], deps=[ "dep+fmt_lib", + "+gc_lib", "+protobuf_lib", "+z_lib", "lib/config", @@ -44,6 +46,7 @@ srcs=["./upgrade-flux-file.cc"], deps=[ "dep+fmt_lib", + "+gc_lib", "+protobuf_lib", "+protocol", "+sqlite3_lib",