From be1284e40a58aaeacadabfb87ccef1c4e7295cf1 Mon Sep 17 00:00:00 2001 From: tycho Date: Sun, 27 Dec 2015 15:39:30 +0000 Subject: More --- src/Option.h | 13 +++++++++ src/WorldStorage/MapSerializer.cpp | 42 ++++++++++++++-------------- src/WorldStorage/SchematicFileSerializer.cpp | 40 +++++++++++++------------- 3 files changed, 54 insertions(+), 41 deletions(-) create mode 100644 src/Option.h (limited to 'src') diff --git a/src/Option.h b/src/Option.h new file mode 100644 index 000000000..f6e6e2d50 --- /dev/null +++ b/src/Option.h @@ -0,0 +1,13 @@ + + +template +class Option +{ +public: + Option(T a_value); + static Option None(); + template + U To(F a_mapper, U a_default) const; + bool HasValue(); + T GetValue(); +}; diff --git a/src/WorldStorage/MapSerializer.cpp b/src/WorldStorage/MapSerializer.cpp index 5b8a44c95..eab9d1ec6 100644 --- a/src/WorldStorage/MapSerializer.cpp +++ b/src/WorldStorage/MapSerializer.cpp @@ -139,7 +139,7 @@ bool cMapSerializer::LoadMapFromNBT(const cParsedNBT & a_NBT) CurrLine = a_NBT.FindChildByName(Data.GetValue(), "dimension"); if ((CurrLine.HasValue()) && (a_NBT.GetType(CurrLine.GetValue()) == TAG_Byte)) { - eDimension Dimension = static_cast(a_NBT.GetByte(CurrLine)); + eDimension Dimension = static_cast(a_NBT.GetByte(CurrLine.GetValue())); if (Dimension != m_Map->m_World->GetDimension()) { @@ -148,10 +148,10 @@ bool cMapSerializer::LoadMapFromNBT(const cParsedNBT & a_NBT) } } - CurrLine = a_NBT.FindChildByName(Data, "width"); - if ((CurrLine >= 0) && (a_NBT.GetType(CurrLine) == TAG_Short)) + CurrLine = a_NBT.FindChildByName(Data.GetValue(), "width"); + if ((CurrLine.HasValue()) && (a_NBT.GetType(CurrLine.GetValue()) == TAG_Short)) { - unsigned int Width = static_cast(a_NBT.GetShort(CurrLine)); + unsigned int Width = static_cast(a_NBT.GetShort(CurrLine.GetValue())); if (Width != 128) { return false; @@ -159,10 +159,10 @@ bool cMapSerializer::LoadMapFromNBT(const cParsedNBT & a_NBT) m_Map->m_Width = Width; } - CurrLine = a_NBT.FindChildByName(Data, "height"); - if ((CurrLine >= 0) && (a_NBT.GetType(CurrLine) == TAG_Short)) + CurrLine = a_NBT.FindChildByName(Data.GetValue(), "height"); + if ((CurrLine.HasValue()) && (a_NBT.GetType(CurrLine.GetValue()) == TAG_Short)) { - unsigned int Height = static_cast(a_NBT.GetShort(CurrLine)); + unsigned int Height = static_cast(a_NBT.GetShort(CurrLine.GetValue())); if (Height >= 256) { return false; @@ -170,27 +170,27 @@ bool cMapSerializer::LoadMapFromNBT(const cParsedNBT & a_NBT) m_Map->m_Height = Height; } - CurrLine = a_NBT.FindChildByName(Data, "xCenter"); - if ((CurrLine >= 0) && (a_NBT.GetType(CurrLine) == TAG_Int)) + CurrLine = a_NBT.FindChildByName(Data.GetValue(), "xCenter"); + if ((CurrLine.HasValue()) && (a_NBT.GetType(CurrLine.GetValue()) == TAG_Int)) { - int CenterX = a_NBT.GetInt(CurrLine); + int CenterX = a_NBT.GetInt(CurrLine.GetValue()); m_Map->m_CenterX = CenterX; } - CurrLine = a_NBT.FindChildByName(Data, "zCenter"); - if ((CurrLine >= 0) && (a_NBT.GetType(CurrLine) == TAG_Int)) + CurrLine = a_NBT.FindChildByName(Data.GetValue(), "zCenter"); + if ((CurrLine.HasValue()) && (a_NBT.GetType(CurrLine.GetValue()) == TAG_Int)) { - int CenterZ = a_NBT.GetInt(CurrLine); + int CenterZ = a_NBT.GetInt(CurrLine.GetValue()); m_Map->m_CenterZ = CenterZ; } unsigned int NumPixels = m_Map->GetNumPixels(); m_Map->m_Data.resize(NumPixels); - CurrLine = a_NBT.FindChildByName(Data, "colors"); - if ((CurrLine >= 0) && (a_NBT.GetType(CurrLine) == TAG_ByteArray)) + CurrLine = a_NBT.FindChildByName(Data.GetValue(), "colors"); + if ((CurrLine.HasValue()) && (a_NBT.GetType(CurrLine.GetValue()) == TAG_ByteArray)) { - memcpy(m_Map->m_Data.data(), a_NBT.GetData(CurrLine), NumPixels); + memcpy(m_Map->m_Data.data(), a_NBT.GetData(CurrLine.GetValue()), NumPixels); } return true; @@ -225,17 +225,17 @@ bool cIDCountSerializer::Load(void) // NOTE: idcounts.dat is not compressed (raw format) // Parse the NBT data: - cParsedNBT NBT(Data.data(), Data.size()); + cParsedNBT NBT(std::basic_string(reinterpret_cast(Data.data()), Data.size())); if (!NBT.IsValid()) { // NBT Parsing failed return false; } - int CurrLine = NBT.FindChildByName(0, "map"); - if (CurrLine >= 0) + auto CurrLine = NBT.FindChildByName(0, "map"); + if (CurrLine.HasValue()) { - m_MapCount = static_cast(NBT.GetShort(CurrLine) + 1); + m_MapCount = static_cast(NBT.GetShort(CurrLine.GetValue()) + 1); } else { @@ -261,7 +261,7 @@ bool cIDCountSerializer::Save(void) Writer.Finish(); #ifdef _DEBUG - cParsedNBT TestParse(Writer.GetResult().data(), Writer.GetResult().size()); + cParsedNBT TestParse(Writer.GetResult()); ASSERT(TestParse.IsValid()); #endif // _DEBUG diff --git a/src/WorldStorage/SchematicFileSerializer.cpp b/src/WorldStorage/SchematicFileSerializer.cpp index 6267668c5..e07d462df 100644 --- a/src/WorldStorage/SchematicFileSerializer.cpp +++ b/src/WorldStorage/SchematicFileSerializer.cpp @@ -72,7 +72,7 @@ bool cSchematicFileSerializer::LoadFromSchematicFile(cBlockArea & a_BlockArea, c File.Close(); // Parse the NBT: - cParsedNBT NBT(Contents.data(), Contents.size()); + cParsedNBT NBT(std::basic_string(reinterpret_cast(Contents.data()), Contents.size())); if (!NBT.IsValid()) { LOG("Cannot parse the NBT in the schematic file \"%s\".", a_FileName.c_str()); @@ -90,7 +90,7 @@ bool cSchematicFileSerializer::LoadFromSchematicFile(cBlockArea & a_BlockArea, c bool cSchematicFileSerializer::LoadFromSchematicString(cBlockArea & a_BlockArea, const AString & a_SchematicData) { // Uncompress the data: - AString UngzippedData; + std::basic_string UngzippedData; if (UncompressStringGZIP(a_SchematicData.data(), a_SchematicData.size(), UngzippedData) != Z_OK) { LOG("%s: Cannot unGZip the schematic data.", __FUNCTION__); @@ -98,7 +98,7 @@ bool cSchematicFileSerializer::LoadFromSchematicString(cBlockArea & a_BlockArea, } // Parse the NBT: - cParsedNBT NBT(UngzippedData.data(), UngzippedData.size()); + cParsedNBT NBT(UngzippedData); if (!NBT.IsValid()) { LOG("%s: Cannot parse the NBT in the schematic data.", __FUNCTION__); @@ -168,38 +168,38 @@ bool cSchematicFileSerializer::SaveToSchematicString(const cBlockArea & a_BlockA bool cSchematicFileSerializer::LoadFromSchematicNBT(cBlockArea & a_BlockArea, cParsedNBT & a_NBT) { - int TMaterials = a_NBT.FindChildByName(a_NBT.GetRoot(), "Materials"); - if ((TMaterials > 0) && (a_NBT.GetType(TMaterials) == TAG_String)) + auto TMaterials = a_NBT.FindChildByName(a_NBT.GetRoot(), "Materials"); + if ((TMaterials.HasValue()) && (a_NBT.GetType(TMaterials.GetValue()) == TAG_String)) { - AString Materials = a_NBT.GetString(TMaterials); + AString Materials = a_NBT.GetString(TMaterials.GetValue()); if (Materials.compare("Alpha") != 0) { LOG("Materials tag is present and \"%s\" instead of \"Alpha\". Possibly a wrong-format schematic file.", Materials.c_str()); return false; } } - int TSizeX = a_NBT.FindChildByName(a_NBT.GetRoot(), "Width"); - int TSizeY = a_NBT.FindChildByName(a_NBT.GetRoot(), "Height"); - int TSizeZ = a_NBT.FindChildByName(a_NBT.GetRoot(), "Length"); + auto TSizeX = a_NBT.FindChildByName(a_NBT.GetRoot(), "Width"); + auto TSizeY = a_NBT.FindChildByName(a_NBT.GetRoot(), "Height"); + auto TSizeZ = a_NBT.FindChildByName(a_NBT.GetRoot(), "Length"); if ( - (TSizeX < 0) || (TSizeY < 0) || (TSizeZ < 0) || - (a_NBT.GetType(TSizeX) != TAG_Short) || - (a_NBT.GetType(TSizeY) != TAG_Short) || - (a_NBT.GetType(TSizeZ) != TAG_Short) + (!TSizeX.HasValue()) || (!TSizeY.HasValue()) || (!TSizeZ.HasValue()) || + (a_NBT.GetType(TSizeX.GetValue()) != TAG_Short) || + (a_NBT.GetType(TSizeY.GetValue()) != TAG_Short) || + (a_NBT.GetType(TSizeZ.GetValue()) != TAG_Short) ) { LOG("Dimensions are missing from the schematic file (%d, %d, %d), (%d, %d, %d)", - TSizeX, TSizeY, TSizeZ, - (TSizeX >= 0) ? a_NBT.GetType(TSizeX) : -1, - (TSizeY >= 0) ? a_NBT.GetType(TSizeY) : -1, - (TSizeZ >= 0) ? a_NBT.GetType(TSizeZ) : -1 + TSizeX.GetValue(), TSizeY.GetValue(), TSizeZ.GetValue(), + (TSizeX.HasValue()) ? a_NBT.GetType(TSizeX.GetValue()) : -1, + (TSizeY.HasValue()) ? a_NBT.GetType(TSizeY.GetValue()) : -1, + (TSizeZ.HasValue()) ? a_NBT.GetType(TSizeZ.GetValue()) : -1 ); return false; } - int SizeX = a_NBT.GetShort(TSizeX); - int SizeY = a_NBT.GetShort(TSizeY); - int SizeZ = a_NBT.GetShort(TSizeZ); + int SizeX = a_NBT.GetShort(TSizeX.GetValue()); + int SizeY = a_NBT.GetShort(TSizeY.GetValue()); + int SizeZ = a_NBT.GetShort(TSizeZ.GetValue()); if ((SizeX < 1) || (SizeX > 65535) || (SizeY < 1) || (SizeY > 256) || (SizeZ < 1) || (SizeZ > 65535)) { LOG("Dimensions are invalid in the schematic file: %d, %d, %d", SizeX, SizeY, SizeZ); -- cgit v1.2.3