From 31c8bd7fd22ddfd267d1a971aefb7b8a25be3c1c Mon Sep 17 00:00:00 2001 From: Kayne Ruse Date: Fri, 21 Feb 2014 03:42:02 +1100 Subject: [PATCH] Split the pager class into two I've also made the base class abstract, and the derived class a template. Hopefully this'll let me work on different parts of the class without major issues. This code compiles, but since it's incomplete, I can't test it properly. --- common/map/region_pager.cpp | 68 +++++++++++++++++++++++-------------- common/map/region_pager.hpp | 54 ++++++++++++++++++++++++----- 2 files changed, 88 insertions(+), 34 deletions(-) diff --git a/common/map/region_pager.cpp b/common/map/region_pager.cpp index af4ad0a..d0a9249 100644 --- a/common/map/region_pager.cpp +++ b/common/map/region_pager.cpp @@ -21,42 +21,60 @@ */ #include "region_pager.hpp" -RegionPager::RegionPager(int argWidth, int argHeight, int argDepth): +#include "utility.hpp" + +#include + +RegionPagerBase::RegionPagerBase(int argWidth, int argHeight, int argDepth): regionWidth(argWidth), regionHeight(argHeight), regionDepth(argDepth) { - // + //EMPTY } -RegionPager::~RegionPager() { - // +RegionPagerBase::~RegionPagerBase() { + //EMPTY } -int RegionPager::SetTile(int x, int y, int z, int v) { - // +int RegionPagerBase::SetTile(int x, int y, int z, int v) { + Region* ptr = GetRegion(snapToBase(regionWidth, x), snapToBase(regionHeight, y)); + return ptr->SetTile(x - ptr->GetX(), y = ptr->GetY(), z, v); } -int RegionPager::GetTile(int x, int y, int z) { - // +int RegionPagerBase::GetTile(int x, int y, int z) { + Region* ptr = GetRegion(snapToBase(regionWidth, x), snapToBase(regionHeight, y)); + return ptr->GetTile(x - ptr->GetX(), y = ptr->GetY(), z); } -Region* RegionPager::GetRegion(int x, int y) { - // +Region* RegionPagerBase::GetRegion(int x, int y) { + //TODO: clean this up + Region* ptr = nullptr; + + //find the loaded region + auto iter = std::find_if(regionList.begin(), regionList.end(), [x,y](Region& it) { + if (it.GetX() == x && it.GetY() == y) + return true; + else + return false; + }); + if (iter != regionList.end()) { //ugly hack + ptr = &(*iter); + } + + //or load the region + if (!ptr) { + ptr = LoadRegion(x, y); + } + + //or create the region + if (!ptr) { + ptr = CreateRegion(x, y); + } + + return ptr; } -void RegionPager::LoadRegion(int x, int y) { - // -} - -void RegionPager::SaveRegion(int x, int y) { - // -} - -void RegionPager::CreateRegion(int x, int y) { - // -} - -void RegionPager::UnloadRegion(int x, int y) { - // -} +void RegionPagerBase::Update() { + //TODO +} \ No newline at end of file diff --git a/common/map/region_pager.hpp b/common/map/region_pager.hpp index fa0576a..3130922 100644 --- a/common/map/region_pager.hpp +++ b/common/map/region_pager.hpp @@ -26,31 +26,67 @@ #include -class RegionPager { +class RegionPagerBase { public: - RegionPager() = delete; - RegionPager(int regionWidth, int regionHeight, int regionDepth); - ~RegionPager(); + RegionPagerBase() = delete; + RegionPagerBase(int regionWidth, int regionHeight, int regionDepth); + ~RegionPagerBase(); int SetTile(int x, int y, int z, int v); int GetTile(int x, int y, int z); + void Update(); + Region* GetRegion(int x, int y); - void LoadRegion(int x, int y); - void SaveRegion(int x, int y); - void CreateRegion(int x, int y); - void UnloadRegion(int x, int y); + //interface + virtual Region* LoadRegion(int x, int y) = 0; + virtual Region* SaveRegion(int x, int y) = 0; + virtual Region* CreateRegion(int x, int y) = 0; + virtual void UnloadRegion(int x, int y) = 0; //accessors int GetRegionWidth() { return regionWidth; } int GetRegionHeight() { return regionHeight; } int GetRegionDepth() { return regionDepth; } -private: +protected: const int regionWidth; const int regionHeight; const int regionDepth; std::list regionList; }; +template +class RegionPager : public RegionPagerBase { +public: + Region* LoadRegion(int x, int y) { + //TODO + //if there's no region to load, return null + } + + Region* SaveRegion(int x, int y) { + //TODO + //save the region using the functor + } + + Region* CreateRegion(int x, int y) { + //TODO + //create the region + //DON'T call this on a non-zero region, + //or if there's a region saved to the disk + } + + void UnloadRegion(int x, int y) { + //TODO + //free the region, possibly saving it + } + + //accessors + MapGenerator* GetGenerator() { return &generator; } + MapFileFormat* GetFormat() { return &format; } +protected: + MapGenerator generator; + MapFileFormat format; +}; + #endif