From 5bc67b6f7c6a4faf4288047e625aeec0314dee5d Mon Sep 17 00:00:00 2001 From: Daniel Stevens Date: Sat, 8 Mar 2025 01:05:26 -0700 Subject: [PATCH 1/9] Update `stringFrom` to handle `Point` and `Vector` types --- NAS2D/StringFrom.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/NAS2D/StringFrom.h b/NAS2D/StringFrom.h index f07dec08..ff52659f 100644 --- a/NAS2D/StringFrom.h +++ b/NAS2D/StringFrom.h @@ -6,6 +6,10 @@ namespace NAS2D { + template struct Point; + template struct Vector; + + template std::string stringFrom(T value) { @@ -22,4 +26,18 @@ namespace NAS2D return std::to_string(value); } } + + + template + std::string stringFrom(Point point) + { + return "(" + std::to_string(point.x) + ", " + std::to_string(point.y) + ")"; + } + + + template + std::string stringFrom(Vector vector) + { + return "(" + std::to_string(vector.x) + ", " + std::to_string(vector.y) + ")"; + } } From 3d6fd2881016a1c90d244164ae766a19e9c829d0 Mon Sep 17 00:00:00 2001 From: Daniel Stevens Date: Sat, 8 Mar 2025 01:06:09 -0700 Subject: [PATCH 2/9] Add unit tests for `stringFrom` with `Point` and `Vector` --- test/StringFrom.test.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/test/StringFrom.test.cpp b/test/StringFrom.test.cpp index 5e651809..50a01ea6 100644 --- a/test/StringFrom.test.cpp +++ b/test/StringFrom.test.cpp @@ -1,5 +1,8 @@ #include "NAS2D/StringFrom.h" +#include "NAS2D/Math/Point.h" +#include "NAS2D/Math/Vector.h" + #include #include @@ -61,3 +64,15 @@ TEST(StringFrom, stringFrom) { ImplicitStringConversionTestFixture implicitStringConversionTestFixture{"testString"}; EXPECT_EQ("testString", NAS2D::stringFrom(implicitStringConversionTestFixture)); } + +TEST(StringFrom, point) { + EXPECT_EQ("(0, 0)", NAS2D::stringFrom(NAS2D::Point{0, 0})); + EXPECT_EQ("(1, 0)", NAS2D::stringFrom(NAS2D::Point{1, 0})); + EXPECT_EQ("(0, 1)", NAS2D::stringFrom(NAS2D::Point{0, 1})); +} + +TEST(StringFrom, vector) { + EXPECT_EQ("(0, 0)", NAS2D::stringFrom(NAS2D::Vector{0, 0})); + EXPECT_EQ("(1, 0)", NAS2D::stringFrom(NAS2D::Vector{1, 0})); + EXPECT_EQ("(0, 1)", NAS2D::stringFrom(NAS2D::Vector{0, 1})); +} From 7e83a06b1ab4d98f5eea797dd3136a4e988b9e03 Mon Sep 17 00:00:00 2001 From: Daniel Stevens Date: Sat, 8 Mar 2025 01:09:59 -0700 Subject: [PATCH 3/9] Split `stringFrom` test case for implicit conversion --- test/StringFrom.test.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/test/StringFrom.test.cpp b/test/StringFrom.test.cpp index 50a01ea6..d98c9c9e 100644 --- a/test/StringFrom.test.cpp +++ b/test/StringFrom.test.cpp @@ -24,6 +24,11 @@ namespace } +TEST(StringFrom, implicitConversion) { + ImplicitStringConversionTestFixture implicitStringConversionTestFixture{"testString"}; + EXPECT_EQ("testString", NAS2D::stringFrom(implicitStringConversionTestFixture)); +} + TEST(StringFrom, stringFrom) { EXPECT_EQ("SomeStringValue", NAS2D::stringFrom("SomeStringValue")); EXPECT_EQ("SomeStringValue", NAS2D::stringFrom(std::string{"SomeStringValue"})); @@ -59,10 +64,6 @@ TEST(StringFrom, stringFrom) { EXPECT_THAT(NAS2D::stringFrom(0.0f), testing::StartsWith("0.0")); EXPECT_THAT(NAS2D::stringFrom(0.0), testing::StartsWith("0.0")); EXPECT_THAT(NAS2D::stringFrom(0.0l), testing::StartsWith("0.0")); - - // Implicit string conversion - ImplicitStringConversionTestFixture implicitStringConversionTestFixture{"testString"}; - EXPECT_EQ("testString", NAS2D::stringFrom(implicitStringConversionTestFixture)); } TEST(StringFrom, point) { From 0b26187e4daa71de567c8eb50db40e3a8f1bff8d Mon Sep 17 00:00:00 2001 From: Daniel Stevens Date: Sat, 8 Mar 2025 01:11:24 -0700 Subject: [PATCH 4/9] Split `stringFrom` test case for strings --- test/StringFrom.test.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/StringFrom.test.cpp b/test/StringFrom.test.cpp index d98c9c9e..b8fe96d3 100644 --- a/test/StringFrom.test.cpp +++ b/test/StringFrom.test.cpp @@ -29,10 +29,12 @@ TEST(StringFrom, implicitConversion) { EXPECT_EQ("testString", NAS2D::stringFrom(implicitStringConversionTestFixture)); } -TEST(StringFrom, stringFrom) { +TEST(StringFrom, string) { EXPECT_EQ("SomeStringValue", NAS2D::stringFrom("SomeStringValue")); EXPECT_EQ("SomeStringValue", NAS2D::stringFrom(std::string{"SomeStringValue"})); +} +TEST(StringFrom, stringFrom) { EXPECT_EQ("false", NAS2D::stringFrom(false)); EXPECT_EQ("true", NAS2D::stringFrom(true)); From 7154d0aff88c49c18152ac4577e2c733d4c2a23e Mon Sep 17 00:00:00 2001 From: Daniel Stevens Date: Sat, 8 Mar 2025 01:12:03 -0700 Subject: [PATCH 5/9] Split `stringFrom` test case for booleans --- test/StringFrom.test.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/StringFrom.test.cpp b/test/StringFrom.test.cpp index b8fe96d3..659f251f 100644 --- a/test/StringFrom.test.cpp +++ b/test/StringFrom.test.cpp @@ -34,10 +34,12 @@ TEST(StringFrom, string) { EXPECT_EQ("SomeStringValue", NAS2D::stringFrom(std::string{"SomeStringValue"})); } -TEST(StringFrom, stringFrom) { +TEST(StringFrom, boolean) { EXPECT_EQ("false", NAS2D::stringFrom(false)); EXPECT_EQ("true", NAS2D::stringFrom(true)); +} +TEST(StringFrom, stringFrom) { using signedChar = signed char; using unsignedChar = unsigned char; EXPECT_EQ("-1", NAS2D::stringFrom(signedChar{-1})); From efd6f154dcc35ee55e13c1afe1987993f041f201 Mon Sep 17 00:00:00 2001 From: Daniel Stevens Date: Sat, 8 Mar 2025 01:13:18 -0700 Subject: [PATCH 6/9] Split `stringFrom` test cases for integers and floating point --- test/StringFrom.test.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/StringFrom.test.cpp b/test/StringFrom.test.cpp index 659f251f..7599ae6e 100644 --- a/test/StringFrom.test.cpp +++ b/test/StringFrom.test.cpp @@ -39,7 +39,7 @@ TEST(StringFrom, boolean) { EXPECT_EQ("true", NAS2D::stringFrom(true)); } -TEST(StringFrom, stringFrom) { +TEST(StringFrom, integers) { using signedChar = signed char; using unsignedChar = unsigned char; EXPECT_EQ("-1", NAS2D::stringFrom(signedChar{-1})); @@ -63,7 +63,9 @@ TEST(StringFrom, stringFrom) { EXPECT_EQ("-1", NAS2D::stringFrom(-1ll)); EXPECT_EQ("0", NAS2D::stringFrom(0ll)); EXPECT_EQ("1", NAS2D::stringFrom(1ull)); +} +TEST(StringFrom, floatingPoint) { // Ignore precision beyond one decimal place EXPECT_THAT(NAS2D::stringFrom(0.0f), testing::StartsWith("0.0")); EXPECT_THAT(NAS2D::stringFrom(0.0), testing::StartsWith("0.0")); From d06940bd2a3c60d90f181f01cb1a50629d9a0b3b Mon Sep 17 00:00:00 2001 From: Daniel Stevens Date: Sat, 8 Mar 2025 01:13:45 -0700 Subject: [PATCH 7/9] Use `stringFrom` to format `Vector` in `Font.cpp` --- NAS2D/Resource/Font.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/NAS2D/Resource/Font.cpp b/NAS2D/Resource/Font.cpp index dfb498b2..623a1713 100644 --- a/NAS2D/Resource/Font.cpp +++ b/NAS2D/Resource/Font.cpp @@ -11,6 +11,7 @@ #include "../Filesystem.h" #include "../Utility.h" +#include "../StringFrom.h" #include "../Math/MathUtils.h" #include "../Math/PointInRectangleRange.h" @@ -272,7 +273,7 @@ namespace if (fontSurfaceSize != glyphSize * GlyphMatrixSize) { SDL_FreeSurface(fontSurface); - throw std::runtime_error("Unexpected font image size. Image dimensions " + std::string{fontSurfaceSize} + " must both be evenly divisible by " + std::to_string(GlyphMatrixSize)); + throw std::runtime_error("Unexpected font image size. Image dimensions " + stringFrom(fontSurfaceSize) + " must both be evenly divisible by " + std::to_string(GlyphMatrixSize)); } Font::FontInfo fontInfo; From 1f79e5751b368ec20f7b1941e7c53317f4b4a87f Mon Sep 17 00:00:00 2001 From: Daniel Stevens Date: Sat, 8 Mar 2025 01:17:04 -0700 Subject: [PATCH 8/9] Use `stringFrom` to format `Point` in `Image.cpp` --- NAS2D/Resource/Image.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/NAS2D/Resource/Image.cpp b/NAS2D/Resource/Image.cpp index 72d296a8..463710ce 100644 --- a/NAS2D/Resource/Image.cpp +++ b/NAS2D/Resource/Image.cpp @@ -13,6 +13,7 @@ #include "../Math/Rectangle.h" #include "../Filesystem.h" #include "../Utility.h" +#include "../StringFrom.h" #if defined(__XCODE_BUILD__) #include @@ -148,7 +149,7 @@ Color Image::pixelColor(Point point) const { if (!Rectangle{{0, 0}, mSize}.contains(point)) { - throw std::runtime_error("Pixel coordinates out of bounds: " + std::string{point}); + throw std::runtime_error("Pixel coordinates out of bounds: " + stringFrom(point)); } if (!mSurface) { throw std::runtime_error("Image has no allocated surface"); } From 0fbfde1456982a39117b2bb8e1cf3eb0809eeb10 Mon Sep 17 00:00:00 2001 From: Daniel Stevens Date: Sat, 8 Mar 2025 01:24:25 -0700 Subject: [PATCH 9/9] Remove `std::string` conversions from `Point` and `Vector` This allows the removal of the `` include. --- NAS2D/Math/Point.h | 7 ------- NAS2D/Math/Vector.h | 7 ------- test/Math/Point.test.cpp | 6 ------ test/Math/Vector.test.cpp | 6 ------ 4 files changed, 26 deletions(-) diff --git a/NAS2D/Math/Point.h b/NAS2D/Math/Point.h index e034c75f..a320a913 100644 --- a/NAS2D/Math/Point.h +++ b/NAS2D/Math/Point.h @@ -12,8 +12,6 @@ #include "Vector.h" -#include - namespace NAS2D { @@ -84,11 +82,6 @@ namespace NAS2D { return Point(*this); } - - explicit operator std::string() const - { - return "(" + std::to_string(x) + ", " + std::to_string(y) + ")"; - } }; diff --git a/NAS2D/Math/Vector.h b/NAS2D/Math/Vector.h index e6eeef44..beca3c7f 100644 --- a/NAS2D/Math/Vector.h +++ b/NAS2D/Math/Vector.h @@ -12,8 +12,6 @@ #include "IsZero.h" -#include - namespace NAS2D { @@ -125,11 +123,6 @@ namespace NAS2D { return Vector(*this); } - - explicit operator std::string() const - { - return "(" + std::to_string(x) + ", " + std::to_string(y) + ")"; - } }; diff --git a/test/Math/Point.test.cpp b/test/Math/Point.test.cpp index 62282174..0d95340a 100644 --- a/test/Math/Point.test.cpp +++ b/test/Math/Point.test.cpp @@ -89,12 +89,6 @@ TEST(Point, to) { EXPECT_EQ((NAS2D::Point{1.0, 2.0}), (NAS2D::Point{1, 2}.to())); } -TEST(Point, stringConversion) { - EXPECT_EQ("(0, 0)", (std::string{NAS2D::Point{0, 0}})); - EXPECT_EQ("(1, 0)", (std::string{NAS2D::Point{1, 0}})); - EXPECT_EQ("(0, 1)", (std::string{NAS2D::Point{0, 1}})); -} - TEST(Point, VectorPointAdd) { EXPECT_EQ((NAS2D::Point{2, 3}), (NAS2D::Vector{1, 2} + NAS2D::Point{1, 1})); } diff --git a/test/Math/Vector.test.cpp b/test/Math/Vector.test.cpp index 275b533e..99a23c70 100644 --- a/test/Math/Vector.test.cpp +++ b/test/Math/Vector.test.cpp @@ -208,12 +208,6 @@ TEST(Vector, to) { EXPECT_EQ((NAS2D::Vector{1.0, 2.0}), (NAS2D::Vector{1, 2}.to())); } -TEST(Vector, stringConversion) { - EXPECT_EQ("(0, 0)", (std::string{NAS2D::Vector{0, 0}})); - EXPECT_EQ("(1, 0)", (std::string{NAS2D::Vector{1, 0}})); - EXPECT_EQ("(0, 1)", (std::string{NAS2D::Vector{0, 1}})); -} - TEST(Vector, scalarVectorMultiply) { EXPECT_EQ((NAS2D::Vector{2, 4}), (2 * NAS2D::Vector{1, 2})); }