Some steps towards defining a general datastore API.

This commit is contained in:
David Given
2024-01-22 20:41:37 +01:00
parent 0beac3c48f
commit 6a48592ca6
4 changed files with 113 additions and 0 deletions

View File

@@ -52,10 +52,12 @@ cxxprogram(
"./fluxvisualiserwidget.cc",
"./imagevisualiserwidget.cc",
"./scene.cc",
"./datastore.cc",
"./globals.h",
"./mainwindow.h",
"./drivecomponent.h",
"./formatcomponent.h",
"./datastore.h",
],
cflags=["-fPIC"],
ldflags=["$(QT5_EXTRA_LIBS)"],

84
src/gui2/datastore.cc Normal file
View File

@@ -0,0 +1,84 @@
#include "lib/globals.h"
#include "lib/image.h"
#include "lib/flux.h"
#include "lib/layout.h"
#include "globals.h"
#include "datastore.h"
class DatastoreImpl : public Datastore
{
W_OBJECT(DatastoreImpl);
public:
DatastoreImpl(
std::shared_ptr<Encoder>& encoder, std::shared_ptr<Decoder>& decoder):
_encoder(encoder),
_decoder(decoder)
{
}
public:
void setDiskData(std::shared_ptr<const DiskFlux> diskData) override {}
void setTrackData(std::shared_ptr<const TrackFlux> trackData) override {
key_t key = {trackData->trackInfo->physicalTrack, trackData->trackInfo->physicalSide};
_tracks[key] = trackData;
}
void setImageData(std::shared_ptr<const Image> imageData) override {
clear();
_loadedSectors = *imageData;
}
void clear() override
{
_loadedSectors.clear();
_changedSectors.clear();
_tracks.clear();
}
public:
std::shared_ptr<const Sector> get(
unsigned track, unsigned side, unsigned sectorId) override
{
auto it = _changedSectors.get(track, side, sectorId);
if (it)
return it;
return _loadedSectors.get(track, side, sectorId);
}
std::shared_ptr<Sector> put(
unsigned track, unsigned side, unsigned sectorId) override
{
return _changedSectors.put(track, side, sectorId);
}
virtual bool isReadOnly() override
{
return false;
}
bool needsFlushing() override
{
return !_changedSectors.empty();
}
private:
std::shared_ptr<Encoder> _encoder;
std::shared_ptr<Decoder> _decoder;
Image _loadedSectors;
Image _changedSectors;
typedef std::pair<unsigned, unsigned> key_t;
std::map<key_t, std::shared_ptr<const TrackFlux>> _tracks;
};
W_OBJECT_IMPL(Datastore);
W_OBJECT_IMPL(DatastoreImpl);
Datastore* Datastore::create(
std::shared_ptr<Encoder>& encoder, std::shared_ptr<Decoder>& decoder)
{
return new DatastoreImpl(encoder, decoder);
}

25
src/gui2/datastore.h Normal file
View File

@@ -0,0 +1,25 @@
#pragma once
#include "lib/vfs/sectorinterface.h"
class Datastore : public SectorInterface, public QObject
{
W_OBJECT(Datastore);
public:
virtual void setDiskData(std::shared_ptr<const DiskFlux> diskData) = 0;
W_SLOT(setDiskData)
virtual void setTrackData(std::shared_ptr<const TrackFlux> trackData) = 0;
W_SLOT(setTrackData)
virtual void setImageData(std::shared_ptr<const Image> imageData) = 0;
W_SLOT(setImageData)
virtual void clear() = 0;
W_SLOT(clear)
public:
static Datastore* create(
std::shared_ptr<Encoder>& encoder, std::shared_ptr<Decoder>& decoder);
};

View File

@@ -11,10 +11,12 @@
class TrackFlux;
class DiskFlux;
class Image;
Q_DECLARE_METATYPE(const ConfigProto*)
W_REGISTER_ARGTYPE(std::shared_ptr<const TrackFlux>)
W_REGISTER_ARGTYPE(std::shared_ptr<const DiskFlux>)
W_REGISTER_ARGTYPE(std::shared_ptr<const Image>)
extern QThreadPool workerThreadPool;