From c83e7f0e6dcde3ce96097cb5577d6dfb86b8c255 Mon Sep 17 00:00:00 2001
From: "Andrew (ShabatovAA)" <ShabatovAA@mpei.ru>
Date: Sun, 21 Apr 2024 23:39:58 +0300
Subject: [PATCH] =?UTF-8?q?build:=20=D0=BA=D0=BE=D0=BD=D0=B5=D1=87=D0=BD?=
 =?UTF-8?q?=D1=8B=D0=B9=20=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 histogram.cpp        |  2 +-
 histogram_internal.h |  6 +++++
 laba.cbp             | 15 +++++++++++
 main.cpp             |  3 ++-
 marks.txt            |  3 +++
 svg.cpp              | 61 ++++++++++++++++++++++++++++++++++++++++++++
 svg.h                | 10 ++++++++
 text.h               |  1 -
 unittest.cbp         | 39 ++++++++++++++++++++++++++++
 unittest.cpp         | 12 +++++++++
 10 files changed, 149 insertions(+), 3 deletions(-)
 create mode 100644 histogram_internal.h
 create mode 100644 marks.txt
 create mode 100644 svg.cpp
 create mode 100644 svg.h
 create mode 100644 unittest.cbp
 create mode 100644 unittest.cpp

diff --git a/histogram.cpp b/histogram.cpp
index da61b14..6aceb65 100644
--- a/histogram.cpp
+++ b/histogram.cpp
@@ -1,7 +1,7 @@
 #include <vector>
 #include "histogram.h"
 using namespace std;
-static void find_minmax(const vector<double>& numbers, double& min, double& max)
+void find_minmax(const vector<double>& numbers, double& min, double& max)
 {
     min = numbers[0];
     max = numbers[0];
diff --git a/histogram_internal.h b/histogram_internal.h
new file mode 100644
index 0000000..5cd1715
--- /dev/null
+++ b/histogram_internal.h
@@ -0,0 +1,6 @@
+#ifndef HISTOGRAM_INTERNAL_H_INCLUDED
+#define HISTOGRAM_INTERNAL_H_INCLUDED
+#include <vector>
+void find_minmax(const std::vector<double>& numbers, double& min, double& max);
+
+#endif // HISTOGRAM_INTERNAL_H_INCLUDED
diff --git a/laba.cbp b/laba.cbp
index 5d9994f..a58db8a 100644
--- a/laba.cbp
+++ b/laba.cbp
@@ -32,7 +32,22 @@
 			<Add option="-Wall" />
 			<Add option="-fexceptions" />
 		</Compiler>
+		<Unit filename="histogram.cpp" />
+		<Unit filename="histogram.h">
+			<Option target="&lt;{~None~}&gt;" />
+		</Unit>
+		<Unit filename="histogram_internal.h">
+			<Option target="&lt;{~None~}&gt;" />
+		</Unit>
 		<Unit filename="main.cpp" />
+		<Unit filename="svg.cpp" />
+		<Unit filename="svg.h">
+			<Option target="&lt;{~None~}&gt;" />
+		</Unit>
+		<Unit filename="text.cpp" />
+		<Unit filename="text.h">
+			<Option target="&lt;{~None~}&gt;" />
+		</Unit>
 		<Extensions />
 	</Project>
 </CodeBlocks_project_file>
diff --git a/main.cpp b/main.cpp
index b6e27d9..72a5d83 100644
--- a/main.cpp
+++ b/main.cpp
@@ -2,6 +2,7 @@
 #include <vector>
 #include "histogram.h"
 #include "text.h"
+#include "svg.h"
 using namespace std;
 
 struct Input{
@@ -32,6 +33,6 @@ int main()
 {
     auto in = input_data();
     auto bins = make_histogram(in.numbers, in.bin_count);
-    show_histogram_text(bins);
+    show_histogram_svg(bins);
     return 0;
 }
diff --git a/marks.txt b/marks.txt
new file mode 100644
index 0000000..2cdb9aa
--- /dev/null
+++ b/marks.txt
@@ -0,0 +1,3 @@
+10
+3 3 4 4 4 4 4 5 5 5
+3
diff --git a/svg.cpp b/svg.cpp
new file mode 100644
index 0000000..f9b348c
--- /dev/null
+++ b/svg.cpp
@@ -0,0 +1,61 @@
+#include "svg.h"
+#include <iostream>
+#include <vector>
+#include <string>
+using namespace std;
+
+void
+svg_begin(double width, double height) {
+    cout << "<?xml version='1.0' encoding='UTF-8'?>\n";
+    cout << "<svg ";
+    cout << "width='" << width << "' ";
+    cout << "height='" << height << "' ";
+    cout << "viewBox='0 0 " << width << " " << height << "' ";
+    cout << "xmlns='http://www.w3.org/2000/svg'>\n";
+}
+
+void
+svg_end() {
+    cout << "</svg>\n";
+}
+
+void
+svg_text(double left, double baseline, string text) {
+    cout << "<text x='"<< left << "' y='"<< baseline <<"'        > "<< text <<" </text>";
+
+}
+
+void
+svg_rect(double x, double y, double width, double height, string stroke = "black", string fill = "black") {
+    cout << "<rect x='" << x << "' y='" << y << "' width='" << width << "' height='" << height << "' stroke= '" << stroke << "' fill='" << fill <<"' />";
+}
+
+void
+show_histogram_svg(const vector<size_t>& bins) {
+    const auto IMAGE_WIDTH = 400;
+    const auto IMAGE_HEIGHT = 300;
+    const auto TEXT_LEFT = 20;
+    const auto TEXT_BASELINE = 20;
+    const auto TEXT_WIDTH = 50;
+    const auto BIN_HEIGHT = 30;
+    const auto BLOCK_WIDTH = 10;
+
+    svg_begin(IMAGE_WIDTH, IMAGE_HEIGHT);
+
+    size_t max_count = bins[0];
+    for(size_t x: bins){
+        if(x > max_count){
+            max_count = x;
+        }
+    }
+    double top = 0;
+    for (size_t bin : bins) {
+        const double bin_width = (IMAGE_WIDTH - TEXT_WIDTH) * bin / max_count;
+        svg_text(TEXT_LEFT, top + TEXT_BASELINE, to_string(bin));
+        svg_rect(TEXT_WIDTH, top, bin_width, BIN_HEIGHT, "black", "blue");
+        top += BIN_HEIGHT;
+    }
+    svg_end();
+}
+
+
diff --git a/svg.h b/svg.h
new file mode 100644
index 0000000..8e4cab3
--- /dev/null
+++ b/svg.h
@@ -0,0 +1,10 @@
+#ifndef SVG_H_INCLUDED
+#define SVG_H_INCLUDED
+#include <vector>
+
+
+void
+show_histogram_svg(const std::vector<size_t>& bins);
+
+
+#endif // SVG_H_INCLUDED
diff --git a/text.h b/text.h
index 56dc36a..2a549ae 100644
--- a/text.h
+++ b/text.h
@@ -2,7 +2,6 @@
 #define TEXT_H_INCLUDED
 #include <vector>
 
-
 void show_histogram_text(const std::vector<size_t>& bins);
 
 
diff --git a/unittest.cbp b/unittest.cbp
new file mode 100644
index 0000000..d291579
--- /dev/null
+++ b/unittest.cbp
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+<CodeBlocks_project_file>
+	<FileVersion major="1" minor="6" />
+	<Project>
+		<Option title="unittest" />
+		<Option pch_mode="2" />
+		<Option compiler="gcc" />
+		<Build>
+			<Target title="Debug">
+				<Option output="bin/Debug/unittest" prefix_auto="1" extension_auto="1" />
+				<Option object_output="obj/Debug/" />
+				<Option type="1" />
+				<Option compiler="gcc" />
+				<Compiler>
+					<Add option="-g" />
+				</Compiler>
+			</Target>
+			<Target title="Release">
+				<Option output="bin/Release/unittest" prefix_auto="1" extension_auto="1" />
+				<Option object_output="obj/Release/" />
+				<Option type="1" />
+				<Option compiler="gcc" />
+				<Compiler>
+					<Add option="-O2" />
+				</Compiler>
+				<Linker>
+					<Add option="-s" />
+				</Linker>
+			</Target>
+		</Build>
+		<Compiler>
+			<Add option="-Wall" />
+		</Compiler>
+		<Unit filename="histogram.cpp" />
+		<Unit filename="histogram_internal.h" />
+		<Unit filename="unittest.cpp" />
+		<Extensions />
+	</Project>
+</CodeBlocks_project_file>
diff --git a/unittest.cpp b/unittest.cpp
new file mode 100644
index 0000000..e783068
--- /dev/null
+++ b/unittest.cpp
@@ -0,0 +1,12 @@
+#define DOCTEST_CONFIG_NO_MULTITHREADING
+#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
+#include "doctest.h"
+#include "histogram_internal.h"
+
+TEST_CASE("distinct positive numbers") {
+    double min = 0;
+    double max = 0;
+    find_minmax({-1, -2 , -5}, min, max);
+    CHECK(min == -3);
+    CHECK(max == -1);
+}