From 76950c6100371c28f82f2e130dcfdb7d7dac97df Mon Sep 17 00:00:00 2001 From: Loek Le Blansch Date: Wed, 9 Oct 2024 17:08:46 +0200 Subject: WIP boilerplate engineering --- Artist.h | 12 ++++++ ArtistData.h | 9 +++++ BlueTileBehavior.h | 1 + CSVParser.h | 2 + Canvas.h | 18 +++++++++ CanvasData.h | 7 ++++ Color.h | 8 ++++ Deserializer.h | 20 ++++++++++ GrayTileBehavior.h | 2 + Museum.h | 11 ++++++ Parser.h | 14 +++++++ ParserStrategy.h | 15 ++++++++ People.h | 16 ++++++++ RedTileBehavior.h | 2 + TXTParser.h | 2 + Tile.h | 15 ++++++++ TileAppearance.h | 2 + TileBehavior.h | 2 + TileData.h | 8 ++++ View.h | 2 + ViewController.h | 2 + XMLParser.h | 2 + YellowTileBehavior.h | 2 + docs/class-diag.puml | 104 ++++++++++++++++++++++++++++----------------------- main.cpp | 12 ++++-- 25 files changed, 241 insertions(+), 49 deletions(-) create mode 100644 Artist.h create mode 100644 ArtistData.h create mode 100644 BlueTileBehavior.h create mode 100644 CSVParser.h create mode 100644 Canvas.h create mode 100644 CanvasData.h create mode 100644 Color.h create mode 100644 Deserializer.h create mode 100644 GrayTileBehavior.h create mode 100644 Museum.h create mode 100644 Parser.h create mode 100644 ParserStrategy.h create mode 100644 People.h create mode 100644 RedTileBehavior.h create mode 100644 TXTParser.h create mode 100644 Tile.h create mode 100644 TileAppearance.h create mode 100644 TileBehavior.h create mode 100644 TileData.h create mode 100644 View.h create mode 100644 ViewController.h create mode 100644 XMLParser.h create mode 100644 YellowTileBehavior.h diff --git a/Artist.h b/Artist.h new file mode 100644 index 0000000..c14785b --- /dev/null +++ b/Artist.h @@ -0,0 +1,12 @@ +#pragma once + +#include "ArtistData.h" + +class Artist { +public: + void update(); + +private: + ArtistData data; +}; + diff --git a/ArtistData.h b/ArtistData.h new file mode 100644 index 0000000..ddee528 --- /dev/null +++ b/ArtistData.h @@ -0,0 +1,9 @@ +#pragma once + +typedef struct { + float x; + float y; + float vx; + float vy; +} ArtistData; + diff --git a/BlueTileBehavior.h b/BlueTileBehavior.h new file mode 100644 index 0000000..6f70f09 --- /dev/null +++ b/BlueTileBehavior.h @@ -0,0 +1 @@ +#pragma once diff --git a/CSVParser.h b/CSVParser.h new file mode 100644 index 0000000..3f59c93 --- /dev/null +++ b/CSVParser.h @@ -0,0 +1,2 @@ +#pragma once + diff --git a/Canvas.h b/Canvas.h new file mode 100644 index 0000000..e4dc65a --- /dev/null +++ b/Canvas.h @@ -0,0 +1,18 @@ +#pragma once + +#include +#include + +#include "CanvasData.h" +#include "Tile.h" + +class Canvas { +public: + virtual Tile & get_tile(unsigned x, unsigned y); + virtual void set_tile(unsigned x, unsigned y, std::unique_ptr t); + +private: + CanvasData data; + std::vector tiles; +}; + diff --git a/CanvasData.h b/CanvasData.h new file mode 100644 index 0000000..19812da --- /dev/null +++ b/CanvasData.h @@ -0,0 +1,7 @@ +#pragma once + +typedef struct { + unsigned rows; + unsigned columns; +} CanvasData; + diff --git a/Color.h b/Color.h new file mode 100644 index 0000000..858b641 --- /dev/null +++ b/Color.h @@ -0,0 +1,8 @@ +#pragma once + +typedef struct { + unsigned int red; + unsigned int green; + unsigned int blue; +} Color; + diff --git a/Deserializer.h b/Deserializer.h new file mode 100644 index 0000000..5123cc9 --- /dev/null +++ b/Deserializer.h @@ -0,0 +1,20 @@ +#pragma once + +#include +#include + +#include "Museum.h" +#include "ArtistData.h" +#include "TileData.h" +#include "Color.h" + +class Deserializer { +public: + void set_target(Museum & m); + void add_artist(std::unique_ptr); + void set_rows(unsigned int); + void set_cols(unsigned int); + void add_type(std::string, Color, unsigned int); + void add_tile(unsigned int x, unsigned int y, std::unique_ptr); +}; + diff --git a/GrayTileBehavior.h b/GrayTileBehavior.h new file mode 100644 index 0000000..3f59c93 --- /dev/null +++ b/GrayTileBehavior.h @@ -0,0 +1,2 @@ +#pragma once + diff --git a/Museum.h b/Museum.h new file mode 100644 index 0000000..f15a2fe --- /dev/null +++ b/Museum.h @@ -0,0 +1,11 @@ +#pragma once + +#include "People.h" +#include "Canvas.h" + +class Museum { +private: + People people; + Canvas canvas; +}; + diff --git a/Parser.h b/Parser.h new file mode 100644 index 0000000..c867f9e --- /dev/null +++ b/Parser.h @@ -0,0 +1,14 @@ +#pragma once + +#include "File.h" +#include "Deserializer.h" +#include "ParserStrategy.h" + +class Parser { +public: + static void parse(File & f, Deserializer & d); + +private: + static void register_strategy(ParserStrategy & p); +}; + diff --git a/ParserStrategy.h b/ParserStrategy.h new file mode 100644 index 0000000..c9f9eff --- /dev/null +++ b/ParserStrategy.h @@ -0,0 +1,15 @@ +#pragma once + +#include "File.h" +#include "Deserializer.h" + +class ParserStrategy { +public: + ParserStrategy() = default; + virtual ~ParserStrategy() = 0; + +public: + virtual void parse(File & f, Deserializer & d) = 0; + virtual unsigned int heuristic(File & f) = 0; +}; + diff --git a/People.h b/People.h new file mode 100644 index 0000000..ff30595 --- /dev/null +++ b/People.h @@ -0,0 +1,16 @@ +#pragma once + +#include +#include + +#include "Artist.h" +#include "ArtistData.h" + +class People { +public: + void add_artist(std::unique_ptr data); + +private: + std::vector artists; +}; + diff --git a/RedTileBehavior.h b/RedTileBehavior.h new file mode 100644 index 0000000..3f59c93 --- /dev/null +++ b/RedTileBehavior.h @@ -0,0 +1,2 @@ +#pragma once + diff --git a/TXTParser.h b/TXTParser.h new file mode 100644 index 0000000..3f59c93 --- /dev/null +++ b/TXTParser.h @@ -0,0 +1,2 @@ +#pragma once + diff --git a/Tile.h b/Tile.h new file mode 100644 index 0000000..d4977de --- /dev/null +++ b/Tile.h @@ -0,0 +1,15 @@ +#pragma once + +#include "TileData.h" +#include "TileBehavior.h" +#include "TileAppearance.h" + +class Tile { +public: + TileData data; + +private: + TileBehavior behavior; + TileAppearance appearance; +}; + diff --git a/TileAppearance.h b/TileAppearance.h new file mode 100644 index 0000000..3f59c93 --- /dev/null +++ b/TileAppearance.h @@ -0,0 +1,2 @@ +#pragma once + diff --git a/TileBehavior.h b/TileBehavior.h new file mode 100644 index 0000000..3f59c93 --- /dev/null +++ b/TileBehavior.h @@ -0,0 +1,2 @@ +#pragma once + diff --git a/TileData.h b/TileData.h new file mode 100644 index 0000000..406947f --- /dev/null +++ b/TileData.h @@ -0,0 +1,8 @@ +#pragma once + +#include + +typedef struct { + std::string type; +} TileData; + diff --git a/View.h b/View.h new file mode 100644 index 0000000..3f59c93 --- /dev/null +++ b/View.h @@ -0,0 +1,2 @@ +#pragma once + diff --git a/ViewController.h b/ViewController.h new file mode 100644 index 0000000..3f59c93 --- /dev/null +++ b/ViewController.h @@ -0,0 +1,2 @@ +#pragma once + diff --git a/XMLParser.h b/XMLParser.h new file mode 100644 index 0000000..3f59c93 --- /dev/null +++ b/XMLParser.h @@ -0,0 +1,2 @@ +#pragma once + diff --git a/YellowTileBehavior.h b/YellowTileBehavior.h new file mode 100644 index 0000000..3f59c93 --- /dev/null +++ b/YellowTileBehavior.h @@ -0,0 +1,2 @@ +#pragma once + diff --git a/docs/class-diag.puml b/docs/class-diag.puml index 96a57f2..8d4fa68 100644 --- a/docs/class-diag.puml +++ b/docs/class-diag.puml @@ -3,10 +3,13 @@ ' TODO: ' - state snapshots (memento) ' - send commands from GUI +' - TileAppearance should have some kind of tile type -> color registry +' - everything added by the algorithms +' - artist collision behavior (both edges and artist-artist) !include style.ipuml -' !include hide-groups.ipuml +!include hide-groups.ipuml ' !include hide-details.ipuml class main as "main()" @@ -54,12 +57,18 @@ rectangle Group_FileReading as "File reading" <> { } rectangle Group_ParsingDeserialization as "Parsing & deserialization" <> { - interface ParserStrategy { - + parse(File, Deserializer) - + heuristic(File) : unsigned int + class Parser { + + parse(File, Deserializer) <> + -- + - register_strategy(ParserStrategy) <> + } + interface ParserStrategy { + + parse(File, Deserializer) <> + + heuristic(File) : unsigned int <> } - ParserStrategy ..> File + ParserStrategy .> Parser + ParserStrategy <. Parser class CSVParser class XMLParser @@ -71,23 +80,16 @@ rectangle Group_ParsingDeserialization as "Parsing & deserialization" <> class Deserializer { + set_target(Museum &) - } - class PeopleDeserializer { + add_artist(uniq) - } - class CanvasDeserializer { + set_rows(unsigned int) + set_cols(unsigned int) + add_type(string, Color, unsigned int) + add_tile(unsigned int x, unsigned int y, uniq) } - PeopleDeserializer -up-|> Deserializer - CanvasDeserializer -up-|> Deserializer - - CSVParser -up-> PeopleDeserializer - XMLParser -up-> CanvasDeserializer - TXTParser -up-> CanvasDeserializer + CSVParser -up-> Deserializer + XMLParser -up-> Deserializer + TXTParser -up-> Deserializer ' ParserStrategy ..> Deserializer } @@ -95,20 +97,18 @@ rectangle Group_ParsingDeserialization as "Parsing & deserialization" <> rectangle Group_Model as "Model" <> { class Canvas { + get_tile(x, y) - + set_tile(x, y) + + set_tile(x, y, TileData) - data : CanvasData - tiles : Tile[] } class People { - + add_artist(uniq) : void + + add_artist(uniq) - artists : Artist[] } class Museum { - + load : - - artists : People + - people : People - canvas : Canvas } - ' TODO color : Color? class Tile { + data : TileData } @@ -130,6 +130,41 @@ rectangle Group_Model as "Model" <> { + rows : unsigned int + columns : unsigned int } + rectangle Group_Tile_Appearance as "Tile appearance" <> { + struct Color { + red : unsigned int + green : unsigned int + blue : unsigned int + } + class TileAppearance { + + color : Color + } + + TileAppearance --> Color + + Tile --> "state" TileAppearance + } + rectangle Group_Tile_Behavior as "Tile behavior" <> { + interface TileBehavior + + together { + class GrayTileBehavior + class RedTileBehavior + class BlueTileBehavior + class YellowTileBehavior + + GrayTileBehavior -d[hidden]- RedTileBehavior + RedTileBehavior -d[hidden]- BlueTileBehavior + BlueTileBehavior -d[hidden]- YellowTileBehavior + } + + TileBehavior <|.. GrayTileBehavior + TileBehavior <|.. RedTileBehavior + TileBehavior <|.. BlueTileBehavior + TileBehavior <|.. YellowTileBehavior + + Tile --> "state" TileBehavior + } Museum --> People Museum --> Canvas @@ -139,11 +174,11 @@ rectangle Group_Model as "Model" <> { Tile --> TileData Artist --> ArtistData - Canvas --> CanvasData + + Canvas -> CanvasData ' LAYOUT Artist -r[hidden] Tile - Tile -r[hidden] CanvasData } rectangle "Visualization" <> { @@ -159,34 +194,11 @@ rectangle "Visualization" <> { View --> SDL2 } -' class TileBehavior -' -' class GrayTileBehavior -' class RedTileBehavior -' class BlueTileBehavior -' class YellowTileBehavior -' -' TileBehavior <|-- GrayTileBehavior -' TileBehavior <|-- RedTileBehavior -' TileBehavior <|-- BlueTileBehavior -' TileBehavior <|-- YellowTileBehavior - -' struct Color { -' red : unsigned int -' green : unsigned int -' blue : unsigned int -' } - ' PeopleDeserializer <... People ' CanvasDeserializer <... Canvas ' Deserializer <... Museum -' class TileAppearance { -' + color : Color -' } -' -' TileAppearance .r Color - +ParserStrategy ..> File ' Museum .> Deserializer : friend Deserializer .> Museum diff --git a/main.cpp b/main.cpp index dfb0a9c..9e11e5b 100644 --- a/main.cpp +++ b/main.cpp @@ -1,12 +1,18 @@ #include #include "FileReader.h" +#include "Museum.h" +#include "Deserializer.h" +#include "Parser.h" int main(int argc, char** argv) { + Museum m {}; + Deserializer d {}; + for (int i = 1; i < argc; i++) { - File & r = FileReader::open(argv[i]); - printf("\n-- %s --\n%s\n", argv[i], r.read().c_str()); - r.close(); + File & f = FileReader::open(argv[i]); + Parser::parse(f, d); + f.close(); } return 0; -- cgit v1.2.3