From f576f1edb77c1f572ecd80475dfdc25951afc49b Mon Sep 17 00:00:00 2001 From: ckormanyos Date: Wed, 28 Aug 2024 20:16:15 +0200 Subject: [PATCH] Big update docs and syntax --- MandelbrotDiscovery/Geometry.h | 47 ++++++----- MandelbrotDiscovery/MandelbrotDiscovery.ico | Bin 46227 -> 52557 bytes MandelbrotDiscovery/MandelbrotDiscovery.rc | Bin 4096 -> 3964 bytes .../MandelbrotDiscovery.vcxproj | 14 +++- .../MandelbrotDiscovery.vcxproj.filters | 42 +++++++--- MandelbrotDiscovery/MandelbrotDiscovery_.rc | Bin 7042 -> 0 bytes MandelbrotDiscovery/Resource.h | 2 +- MandelbrotDiscovery/mandelbrot_discovery.cpp | 23 +++--- MandelbrotDiscovery/mandelbrot_discovery.h | 70 ++++++++--------- MandelbrotDiscovery/small.ico | Bin 46227 -> 0 bytes MandelbrotDiscovery/text.h | 42 ---------- MandelbrotDiscovery/utility.h | 74 +++++++++++++++--- README.md | 16 +++- codecov.yml | 2 +- lgtm.yml | 50 ------------ .../mandelbrot_cfg_MANDELBROT_99_TRY_POINTS.h | 38 ++++----- mandelbrot/mandelbrot.h | 10 +-- mandelbrot/mandelbrot_color.h | 12 +++ .../mandelbrot_generator_perturbative.h | 2 +- mandelbrot/mandelbrot_generator_trivial.h | 4 +- ...mandelbrot_text_output.h => text_output.h} | 18 +++-- mandelbrot_vs2022.vcxproj | 3 +- mandelbrot_vs2022.vcxproj.filters | 7 +- 23 files changed, 246 insertions(+), 230 deletions(-) delete mode 100644 MandelbrotDiscovery/MandelbrotDiscovery_.rc delete mode 100644 MandelbrotDiscovery/small.ico delete mode 100644 MandelbrotDiscovery/text.h delete mode 100644 lgtm.yml rename mandelbrot/{mandelbrot_text_output.h => text_output.h} (59%) diff --git a/MandelbrotDiscovery/Geometry.h b/MandelbrotDiscovery/Geometry.h index e44b5ab..53b3bad 100644 --- a/MandelbrotDiscovery/Geometry.h +++ b/MandelbrotDiscovery/Geometry.h @@ -1,8 +1,8 @@ /////////////////////////////////////////////////////////////////////////////// -// Copyright Christopher Kormanyos 2024. -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) +// Copyright Christopher Kormanyos 2024. +// Distributed under the Boost Software License, +// Version 1.0. (See accompanying file LICENSE_1_0.txt +// or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef GEOMETRY_2024_04_13_H @@ -15,8 +15,8 @@ { using value_type = T; - point_type(const value_type& x_val = value_type(), - const value_type& y_val = value_type()) + explicit point_type(const value_type& x_val = value_type(), + const value_type& y_val = value_type()) : my_x(x_val), my_y(y_val) { } @@ -32,7 +32,7 @@ explicit rectangle_type(const point_type& center, const value_type& dx_half, - const value_type& dy_half = dx_half) + const value_type& dy_half = dx_half) noexcept : my_center (center), my_dx_half(dx_half), my_dy_half(dy_half) { } @@ -41,8 +41,8 @@ auto operator*=(const int n) -> rectangle_type& { - my_dx_half *= n; - my_dy_half *= n; + static_cast(my_dx_half *= n); + static_cast(my_dy_half *= n); static_cast(set_pixel_assoc(my_pixels_x, my_pixels_y)); @@ -51,38 +51,45 @@ auto operator/=(const int n) -> rectangle_type& { - my_dx_half /= n; - my_dy_half /= n; + static_cast(my_dx_half /= n); + static_cast(my_dy_half /= n); static_cast(set_pixel_assoc(my_pixels_x, my_pixels_y)); return *this; } - auto upper_left() const -> point_type + auto upper_left() const noexcept -> point_type { return - { + point_type + ( my_center.my_x - my_dx_half, my_center.my_y + my_dy_half - }; + ); } - auto lower_right() const -> point_type + auto lower_right() const noexcept -> point_type { return - { + point_type + ( my_center.my_x + my_dx_half, my_center.my_y - my_dy_half - }; + ); + } + + auto dx_half() const noexcept -> value_type + { + return my_dx_half; } - auto recenter(const point_type& new_center) -> void + auto recenter(const point_type& new_center) noexcept -> void { my_center = new_center; } - auto set_pixel_assoc(const int pa_x, const int pa_y) -> bool + auto set_pixel_assoc(const int pa_x, const int pa_y) noexcept -> bool { bool result_is_ok { }; @@ -103,7 +110,7 @@ return result_is_ok; } - auto pixel_to_point(const int pa_x, const int pa_y, point_type& pt_val) const -> bool + auto pixel_to_point(const int pa_x, const int pa_y, point_type& pt_val) const noexcept -> bool { bool result_is_ok { }; diff --git a/MandelbrotDiscovery/MandelbrotDiscovery.ico b/MandelbrotDiscovery/MandelbrotDiscovery.ico index b3ec03bd617f32e58128fa977fd6ac9605124f4b..11159e9543947e70ca5fd7340338d77baf007e39 100644 GIT binary patch literal 52557 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 %O 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%0DN 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 YC58-NK~KQOew#ap{WjXB_eb^jKQj%{z5oCK literal 46227 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 + + + + + + + - + @@ -102,11 +109,10 @@ - - + - + diff --git a/MandelbrotDiscovery/MandelbrotDiscovery.vcxproj.filters b/MandelbrotDiscovery/MandelbrotDiscovery.vcxproj.filters index ca80789..52d7cba 100644 --- a/MandelbrotDiscovery/MandelbrotDiscovery.vcxproj.filters +++ b/MandelbrotDiscovery/MandelbrotDiscovery.vcxproj.filters @@ -8,20 +8,18 @@ {034a081b-19d0-421d-bc9e-64f78778af4c} + + {de0d8cae-70cf-4e55-9cc5-911309601a15} + + + {dda69a90-a29e-43eb-96e8-d844de4988d2} + MandelbrotDiscovery - - - MandelbrotDiscovery - - - MandelbrotDiscovery - - MandelbrotDiscovery @@ -32,7 +30,28 @@ MandelbrotDiscovery - + + mandelbrot + + + mandelbrot + + + mandelbrot + + + mandelbrot + + + mandelbrot + + + concurrency + + + concurrency + + MandelbrotDiscovery @@ -46,4 +65,9 @@ _doc + + + MandelbrotDiscovery + + \ No newline at end of file diff --git a/MandelbrotDiscovery/MandelbrotDiscovery_.rc b/MandelbrotDiscovery/MandelbrotDiscovery_.rc deleted file mode 100644 index bf7f0c380b78544d48b4f7203cd2a53f36ba7e71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7042 zcmdT}+fE}#5UuA(`G?6Mt#%az*uZY`6dBtXYkiY#2uMhXwbuj*u;t5cR?5fcoa!lN z#&f|2MVe@2dZsVcr>jm?S2z2zFKxM(k<4W(3;ZUs6i+Ttw~&?G$^*Wt@+%%s?&PaH z;WtP966F|mbCevn!rKV%9=<5;US{aCCqK(im}6hd9n?Od^#Q%d+SgBv-;=+@*WMht zqx~j2jZq;Zy(2BTLd^hw+j4@M7T#@sVkq8Y=&bal0llp2 zcmgd=jV1moRow0yb+&#;P`;_swdFO4jMtbT~jK}nE4?Smi9?)xq_a#cA z@$@^2%f*97^r81H(8J+g;G0MoX^6*-CK^Wjh5QIwA5ppp!qpLV6LxK@Eg5fGh_ZdK zWT-6zFr|y=QAgbscTi{@nc#tnx;S`u^ijZhseE9(!T`lMnhxhtn{D>+H>{HM7HopT~)WRTRZSvjy=J90}?ta z$@JQToqO=*9<=VuJH(88*zRj!8|#%m)>>_rrtW2Jl~jkUzaeW0NsJEp57*V!ICBYv z!x%!w9=Cs)jCIUs%D35@F~5U1d;u?4>PdUx>0S-*%w$|k8+A36ehOAq5LuW{hwZ1B`x15R zeTAQE`%|SxV+%*P+A5^zXQ&YIM-&8l;Ux{|0 zCkMB~*P!{kAo8VqPWFE3;wgFDhd!ALaCZoGwu^7K-%$JXQp(yzrg!xGw~Vh{*yup5 zWD%Oa`cB z%&@(Tx(W<42 z(XuTc@1LJ%;5%1Zl0%e7YKdd@8zz0obnkIdj_i%bxu~VnC522R4~FWK zJb@7zrG1L=)q3~Q-T+^c{Y&85Vd@yNs<)whuEz1OofvT}$1(XKzrwfZJ%V9&Hcj3E zai#HFi`UuJcvQSH$!v?2Tzhx}6zx}n?X!EOb1D5k?pk9fWrz0RSNT;lIDgyx7U~+2 z^BN}`x4#(|eD&M)+e9DHHT`bNhm0&aJU6);tL#2+xy8zsn!FG7_11uRqIX+)==1M{ z@@~AcaAn#1@KyHSc9yq$e)0U*5JmlybO}KewxoHo +#include #include #include namespace local::cfg { - constexpr int MANDELBROT_COORD_PNT_DIGITS10 = 112; - constexpr int MANDELBROT_ITERATION_DIGITS10 = 112; + constexpr int MANDELBROT_COORD_PNT_DIGITS10 = 132; + constexpr int MANDELBROT_ITERATION_DIGITS10 = 132; constexpr int MANDELBROT_CALCULATION_PIXELS_X = 768; constexpr int MANDELBROT_CALCULATION_PIXELS_Y = 768; @@ -26,9 +27,9 @@ namespace local::cfg static_assert(local::cfg::MANDELBROT_CALCULATION_PIXELS_X == local::cfg::MANDELBROT_CALCULATION_PIXELS_Y, "Error: This program is only compilable for square geometry"); -static_assert(utility::equal(local::cfg::MANDELBROT_POINT_DX_HALF, - local::cfg::MANDELBROT_POINT_DX_HALF + sizeof(local::cfg::MANDELBROT_POINT_DX_HALF), - local::cfg::MANDELBROT_POINT_DY_HALF), +static_assert(util::utility::equal(local::cfg::MANDELBROT_POINT_DX_HALF, + local::cfg::MANDELBROT_POINT_DX_HALF + sizeof(local::cfg::MANDELBROT_POINT_DX_HALF), + local::cfg::MANDELBROT_POINT_DY_HALF), "Error: This program is only compilable for square geometry"); using mandelbrot_coord_pnt_type = boost::multiprecision::number, boost::multiprecision::et_off>; @@ -42,7 +43,9 @@ inline auto center_y() -> mandelbrot_coord_pnt_type { return mandelbrot_coord_pn using local_window_type = mandelbrot_discovery(INT16_C(800)), static_cast(INT16_C(800)), mandelbrot_coord_pnt_type, - mandelbrot_iteration_type>; + mandelbrot_iteration_type, + mandelbrot_discovery_detail::WindowTitleDefault, + IDI_MANDELBROT_DISCO>; using point_type = typename local_window_type::point_type; using rectangle_type = typename local_window_type::rectangle_type; diff --git a/MandelbrotDiscovery/mandelbrot_discovery.h b/MandelbrotDiscovery/mandelbrot_discovery.h index e3628aa..5c40ab4 100644 --- a/MandelbrotDiscovery/mandelbrot_discovery.h +++ b/MandelbrotDiscovery/mandelbrot_discovery.h @@ -1,8 +1,8 @@ /////////////////////////////////////////////////////////////////////////////// -// Copyright Christopher Kormanyos 2024. -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) +// Copyright Christopher Kormanyos 2024. +// Distributed under the Boost Software License, +// Version 1.0. (See accompanying file LICENSE_1_0.txt +// or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef MANDELBROT_DISCOVERY_2024_04_12_H @@ -11,29 +11,16 @@ #define NOMINMAX #include - #include - - #include - - #if !defined(MANDELBROT_NODISCARD) - #if defined(_MSC_VER) && !defined(__GNUC__) - #define MANDELBROT_NODISCARD - #else - #if (defined(__cplusplus) && (__cplusplus >= 201703L)) - #define MANDELBROT_NODISCARD [[nodiscard]] // NOLINT(cppcoreguidelines-macro-usage) - #else - #define MANDELBROT_NODISCARD - #endif - #endif - #endif + #include #include #include - #include #include + #include #include + #include #include #include #include @@ -53,7 +40,7 @@ const int WindowHeight, typename MandelbrotCoordPntType, typename MandelbrotIterationType, - const char* WindowTitle = mandelbrot_discovery_detail::WindowTitleDefault, + const char* WindowTitle, const int IconId = static_cast(INT8_C(0)), const int ScreenCoordinateX = static_cast(UINT16_C(32)), const int ScreenCoordinateY = static_cast(UINT16_C(8))> @@ -189,7 +176,7 @@ + static_cast(INT8_C(24)) ); - ::SetWindowPos(::GetConsoleWindow(), nullptr, pos_x, 64, 768, 512, SWP_NOZORDER); + ::SetWindowPos(::GetConsoleWindow(), nullptr, pos_x, 64, 896, 512, SWP_NOZORDER); // Get handles to the standard output and input. console_output() = ::GetStdHandle(STD_OUTPUT_HANDLE); @@ -265,8 +252,8 @@ static rectangle_type* my_ptr_to_rectangle; static std::thread my_thread; - static volatile ::LONG my_thread_wants_exit; - static volatile ::LONG my_thread_did_exit; + static std::atomic my_thread_wants_exit; + static std::atomic my_thread_did_exit; static std::atomic my_thread_wait_for_new_set_click; static my_coord_pnt_numeric_type my_mandelbrot_zoom_factor; static std::uint_fast32_t my_mandelbrot_iterations; @@ -281,14 +268,14 @@ static auto console_sync_mtx() -> std::mutex&; - static auto set_wait_for_click_response(const bool set_on) -> bool + static auto set_wait_for_click_response(const bool set_on) noexcept -> bool { my_thread_wait_for_new_set_click.store(set_on); return (get_wait_for_click_response() == set_on); } - static auto get_wait_for_click_response() -> bool + static auto get_wait_for_click_response() noexcept -> bool { return my_thread_wait_for_new_set_click.load(); } @@ -437,9 +424,10 @@ if(result_is_ok) { - result_is_ok = (write_number("x_val: ", my_rectangle_center.my_x) && result_is_ok); - result_is_ok = (write_number("y_val: ", my_rectangle_center.my_y) && result_is_ok); - result_is_ok = (write_string("\n") && result_is_ok); + result_is_ok = (write_number("x_val : ", my_rectangle_center.my_x) && result_is_ok); + result_is_ok = (write_number("y_val : ", my_rectangle_center.my_y) && result_is_ok); + result_is_ok = (write_number("dx_half: ", my_ptr_to_rectangle->dx_half(), 3) && result_is_ok); + result_is_ok = (write_string("\n") && result_is_ok); } const auto lresult = @@ -457,7 +445,7 @@ if(message == static_cast<::UINT>(WM_DESTROY)) { // Exit the process thread. - static_cast(::InterlockedExchange(&my_thread_wants_exit, static_cast<::LONG>(INT8_C(1)))); + my_thread_wants_exit.store(true); my_thread.join(); @@ -465,7 +453,7 @@ i < static_cast(UINT8_C(200)); ++i) { - if(my_thread_did_exit == static_cast<::LONG>(INT8_C(1))) + if(my_thread_did_exit.load()) { break; } @@ -492,7 +480,7 @@ static auto thread_process() -> void { - while(my_thread_wants_exit == static_cast<::LONG>(INT8_C(0))) + while(my_thread_wants_exit.load() == static_cast<::LONG>(INT8_C(0))) { std::this_thread::sleep_for(std::chrono::microseconds(static_cast(UINT8_C(20)))); @@ -573,7 +561,7 @@ } else if(str_cmd == "exit") { - static_cast(::InterlockedExchange(&my_thread_wants_exit, static_cast<::LONG>(INT8_C(1)))); + my_thread_wants_exit.store(true); using local_window_type = mandelbrot_discovery; @@ -601,7 +589,7 @@ } } - static_cast(::InterlockedExchange(&my_thread_did_exit, static_cast<::LONG>(INT8_C(1)))); + my_thread_did_exit.store(true); } static auto load_jpeg_image(const wchar_t* filename) -> HBITMAP @@ -753,13 +741,19 @@ return result_write_is_ok; } - static auto write_number(const std::string& str_prefix, const typename point_type::value_type& val) -> bool + static auto write_number(const std::string& str_prefix, const typename point_type::value_type& val, const int prec = -1) -> bool { using local_value_type = typename point_type::value_type; std::stringstream strm { }; - strm << std::setprecision(std::numeric_limits::digits10) << std::showpos << val; + const std::streamsize my_prec = + static_cast + ( + (prec == -1) ? std::numeric_limits::digits10 : prec + ); + + strm << std::setprecision(my_prec) << std::showpos << val; const std::string str_val { str_prefix + strm.str() + "\n" }; @@ -830,7 +824,7 @@ const int IconId, const int ScreenCoordinateX, const int ScreenCoordinateY> - volatile ::LONG mandelbrot_discovery::my_thread_wants_exit; + std::atomic mandelbrot_discovery::my_thread_wants_exit { false }; template - volatile ::LONG mandelbrot_discovery::my_thread_did_exit; + std::atomic mandelbrot_discovery::my_thread_did_exit { false }; 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 - - #include - - #include - #include - - namespace util::text { - - class text_output_alloc_console : public ckormanyos::mandelbrot::mandelbrot_text_output_base // NOLINT(cppcoreguidelines-special-member-functions,hicpp-special-member-functions) - { - public: - using callback_function_type = bool(*)(const std::string&); - - text_output_alloc_console(callback_function_type cbk) : my_callback(cbk) { } - - ~text_output_alloc_console() override = default; - - auto write(const std::string& str_to_write) -> bool override - { - my_callback(str_to_write); - - return true; - } - - private: - callback_function_type my_callback { nullptr }; - }; - - } // namespace util::text - -#endif // TEXT_2024_04_16_H diff --git a/MandelbrotDiscovery/utility.h b/MandelbrotDiscovery/utility.h index 1392e27..fea5651 100644 --- a/MandelbrotDiscovery/utility.h +++ b/MandelbrotDiscovery/utility.h @@ -1,20 +1,72 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright Christopher Kormanyos 2024. +// Distributed under the Boost Software License, +// Version 1.0. (See accompanying file LICENSE_1_0.txt +// or copy at http://www.boost.org/LICENSE_1_0.txt) +// + #ifndef UTILITY_2024_04_14_H #define UTILITY_2024_04_14_H - namespace utility + #include + + #if(__cplusplus >= 201703L) + namespace util::utility { + #else + namespace util { namespace utility { // NOLINT(modernize-concat-nested-namespaces) + #endif + + template + constexpr auto equal(input_iterator1 first1, input_iterator1 last1, input_iterator2 first2) -> bool { - template - constexpr auto equal(input_iterator1 first1, input_iterator1 last1, input_iterator2 first2) -> bool + while((first1 != last1) && (*first1 == *first2)) { - while((first1 != last1) && (*first1 == *first2)) - { - ++first1; - ++first2; - } - - return { first1 == last1 }; + ++first1; + ++first2; } + + return { first1 == last1 }; + } + + #if(__cplusplus >= 201703L) + } // namespace util::utility + #else } // namespace utility + } // namespace util + #endif + + #if(__cplusplus >= 201703L) + namespace util::text { + #else + namespace util { namespace text { // NOLINT(modernize-concat-nested-namespaces) + #endif + + class text_output_alloc_console : public ckormanyos::mandelbrot::text_output_base // NOLINT(cppcoreguidelines-special-member-functions,hicpp-special-member-functions) + { + public: + explicit text_output_alloc_console(callback_function_type cbk) : my_callback { cbk } { } + + text_output_alloc_console() = delete; + + ~text_output_alloc_console() override = default; + + auto write(const std::string& str_to_write) -> bool override + { + my_callback(str_to_write); + + return true; + } + + private: + callback_function_type my_callback { nullptr }; + }; + + #if(__cplusplus >= 201703L) + } // namespace util::text + #else + } // namespace text + } // namespace util + #endif #endif // UTILITY_2024_04_14_H diff --git a/README.md b/README.md index 90dade0..b38d77b 100644 --- a/README.md +++ b/README.md @@ -76,7 +76,7 @@ The following design goals have been incorporated. ### Build and run in the `*nix` shell -The commands are as shown below, where you need to specialize `--boost`, `--my_cc_` and `--stdcc` accordingly (if needed): +The commands are as shown below, where you need to specialize `--boost`, `--my_cc` and `--stdcc` accordingly (if needed): ```sh cd mandlebrot @@ -88,15 +88,16 @@ mkdir -p images/tmp In summary, the script [`build_all.sh`](./build_all.sh) is used to: - Build the JPEG, ZLIB and PNG libraries with GNUmake. - Compile and link [`test_mandelbrot.cpp`](https://github.com/ckormanyos/mandelbrot/blob/main/test/test_mandelbrot.cpp) to obtain the test program `test_mandelbrot.exe`. - - Execute the test program via `./test_mandelbrot.exe`. The resulting JPEG and PNG images will be placed as a temporary file in the `images/tmp` folder. - This build makes and uses its own specialized version of the JPEG-6b library (see [below](#Adaptions-of-and-Notes-on-jpeg-6b)) and does not install or use a standard `*nix` version thereof. - - This build also makes and uses specialized versions of the libpng-1.6.44 library and the zlib-1.3.1.1 library. + - This build also makes and uses specialized versions of the [libpng](http://www.libpng.org/pub/png) and the [zlib](https://www.zlib.net) libraries. Simply go to the [`mandelbrot`](https://github.com/ckormanyos/mandelbrot/tree/main) directory and run the build shell script [`build_all.sh`](./build_all.sh). You may need to supply your system's (or your desired local) path to boost. -Make the needed output image directory and run `test_mandelbrot.exe`. +The build script does not execute the test program (i.e., via `./test_mandelbrot.exe`). +Test program execution must be performed manually. In order to do this, +make the needed output image directory and run `test_mandelbrot.exe` as shown above. ### Optionally Use `gmp_float` @@ -105,6 +106,13 @@ instead of `cpp_dec_float`, where both backends are from [`Boost.Multiprecision`](https://www.boost.org/doc/libs/1_86_0/libs/multiprecision/doc/html/index.html), simply use [`build_all_gmp.sh`](./build_all_gmp.sh) +```sh +cd mandlebrot +./build_all_gmp.sh --boost=../boost-root --my_cc=g++ --stdcc=c++20 +mkdir -p images/tmp +./test_mandelbrot.exe +``` + In other words, in `*nix`, it is also possible to optionally make straightforward use of GMP via `Boost.Multiprecision`'s `gmp_float` backend (instead of the default `cpp_dec_float` backend). diff --git a/codecov.yml b/codecov.yml index fb3cd75..d267ceb 100644 --- a/codecov.yml +++ b/codecov.yml @@ -1,5 +1,5 @@ # ------------------------------------------------------------------------------ -# Copyright Christopher Kormanyos 2022. +# Copyright Christopher Kormanyos 2022 - 2024. # Distributed under the Boost Software License, # Version 1.0. (See accompanying file LICENSE_1_0.txt # or copy at http://www.boost.org/LICENSE_1_0.txt) diff --git a/lgtm.yml b/lgtm.yml deleted file mode 100644 index 5d1d0ca..0000000 --- a/lgtm.yml +++ /dev/null @@ -1,50 +0,0 @@ -# ------------------------------------------------------------------------------ -# Copyright Christopher Kormanyos 2022. -# Distributed under the Boost Software License, -# Version 1.0. (See accompanying file LICENSE_1_0.txt -# or copy at http://www.boost.org/LICENSE_1_0.txt) -# ------------------------------------------------------------------------------ - -path_classifiers: - test: - - "*test_mandelbrot.cpp" -queries: - - include: - tags: - - "security" - - "correctness" - - include: - severity: "error" - - include: - severity: "warning" -extraction: - cpp: - prepare: # Customizable step used by all languages. - packages: - - g++-20 - after_prepare: # Customizable step used by all languages. - - export GIT=true - configure: # Customizable step used only by C/C++ extraction. - command: - before_index: # Customizable step used by all languages. - - export BOOST_DIR=$LGTM_SRC/boost - index: # Customizable step used by all languages. - build_command: - sudo apt-get update --quiet - sudo apt-get install --no-install-recommends --quiet --yes libboost-dev - echo "query GCC version" - g++ -v - echo "build libjpeg-6b.a" - cd jpeg - make all - cd .. - echo 'g++ -c -finline-functions -march=native -mtune=native -O3 -Wall -Wextra -std=c++2a -I. -Ijpeg/jpeg-6b-2022 -pthread test/test_mandelbrot.cpp -o test_mandelbrot.o' - g++ -c -finline-functions -march=native -mtune=native -O3 -Wall -Wextra -std=c++2a -I. -Ijpeg/jpeg-6b-2022 -pthread test/test_mandelbrot.cpp -o test_mandelbrot.o - echo 'g++ test_mandelbrot.o -lpthread -ljpeg-6b -Ljpeg/jpeg-6b-2022/obj -o test_mandelbrot.exe' - g++ test_mandelbrot.o -lpthread -ljpeg-6b -Ljpeg/jpeg-6b-2022/obj -o test_mandelbrot.exe - ls -la ./test_mandelbrot.exe - mkdir -p images/tmp - ./test_mandelbrot.exe - ls -la ./images/tmp/mandelbrot_MANDELBROT_05_SEAHORSES.jpg - echo 'sha1sum ./images/tmp/sha1sum mandelbrot_MANDELBROT_05_SEAHORSES.jpg | grep f3abc4437d97bba945d589aac3d96d8bbb67a035' - sha1sum ./images/tmp/mandelbrot_MANDELBROT_05_SEAHORSES.jpg | grep f3abc4437d97bba945d589aac3d96d8bbb67a035 diff --git a/mandelbrot/cfg/mandelbrot_cfg_MANDELBROT_99_TRY_POINTS.h b/mandelbrot/cfg/mandelbrot_cfg_MANDELBROT_99_TRY_POINTS.h index b8031ff..fa705cb 100644 --- a/mandelbrot/cfg/mandelbrot_cfg_MANDELBROT_99_TRY_POINTS.h +++ b/mandelbrot/cfg/mandelbrot_cfg_MANDELBROT_99_TRY_POINTS.h @@ -8,32 +8,34 @@ #ifndef MANDELBROT_CFG_MANDELBROT_99_TRY_POINTS_2024_04_30_H #define MANDELBROT_CFG_MANDELBROT_99_TRY_POINTS_2024_04_30_H - // This is the classic full immage. + // This is a specialized configuration file intended to be used for simply + // trying out deep dives, such as those found by MandelbrotDiscovery + // or found by other methods. constexpr char MANDELBROT_FILENAME_STRING[] = "MANDELBROT_99_TRY_POINTS"; - constexpr int MANDELBROT_COORD_PNT_DIGITS10 = 82; - constexpr int MANDELBROT_ITERATION_DIGITS10 = 82; + constexpr int MANDELBROT_COORD_PNT_DIGITS10 = 58; + constexpr int MANDELBROT_ITERATION_DIGITS10 = 58; constexpr int MANDELBROT_CALCULATION_PIXELS_X = 2048; constexpr int MANDELBROT_CALCULATION_PIXELS_Y = 2048; - constexpr int MANDELBROT_CALCULATION_ITERATIONS = 20000; + constexpr int MANDELBROT_CALCULATION_ITERATIONS = 8000; - constexpr char MANDELBROT_POINT_DX_HALF[] = "9.8E-54"; - constexpr char MANDELBROT_POINT_DY_HALF[] = "9.8E-54"; - constexpr char MANDELBROT_POINT_CENTER_X[] = "-1.252508293681668981848141890554793831651285056960614677979723771484375"; - constexpr char MANDELBROT_POINT_CENTER_Y[] = "-0.034697514077867448435398475652836924954212095455636155250775048828125"; + constexpr char MANDELBROT_POINT_DX_HALF[] = "1.15E-31"; + constexpr char MANDELBROT_POINT_DY_HALF[] = "1.15E-31"; + constexpr char MANDELBROT_POINT_CENTER_X[] = "-1.9771841957832528683253271547935727033203125"; + constexpr char MANDELBROT_POINT_CENTER_Y[] = "+0.0003701587934278647349697471824343197265625"; #if 0 - constexpr int MANDELBROT_COORD_PNT_DIGITS10 = 64; - constexpr int MANDELBROT_ITERATION_DIGITS10 = 64; - constexpr int MANDELBROT_CALCULATION_PIXELS_X = 2048; - constexpr int MANDELBROT_CALCULATION_PIXELS_Y = 2048; - constexpr int MANDELBROT_CALCULATION_ITERATIONS = 20000; - - constexpr char MANDELBROT_POINT_DX_HALF[] = "8.8E-37"; - constexpr char MANDELBROT_POINT_DY_HALF[] = "8.8E-37"; - constexpr char MANDELBROT_POINT_CENTER_X[] = "-0.86163746968572280977496717541865570064658203125"; - constexpr char MANDELBROT_POINT_CENTER_Y[] = "-0.27782204381125878606894596506117674816369140625"; + constexpr int MANDELBROT_COORD_PNT_DIGITS10 = 132; + constexpr int MANDELBROT_ITERATION_DIGITS10 = 132; + constexpr int MANDELBROT_CALCULATION_PIXELS_X = 512; + constexpr int MANDELBROT_CALCULATION_PIXELS_Y = 512; + constexpr int MANDELBROT_CALCULATION_ITERATIONS = 12000; + + constexpr char MANDELBROT_POINT_DX_HALF[] = "1.35E-92"; + constexpr char MANDELBROT_POINT_DY_HALF[] = "1.35E-92"; + constexpr char MANDELBROT_POINT_CENTER_X[] = "-1.711024498065425783442616962887150075536644429276936212772197371643420276616709106166700677273062220703125"; + constexpr char MANDELBROT_POINT_CENTER_Y[] = "+0.003998130357843762350089770108611803382417083111382471700501416344256825824943651749566227455277501953125"; #endif #define MANDELBROT_GENERATOR_TYPE mandelbrot_generator_trivial // NOLINT(cppcoreguidelines-macro-usage) diff --git a/mandelbrot/mandelbrot.h b/mandelbrot/mandelbrot.h index a18cfb5..8d55a8f 100644 --- a/mandelbrot/mandelbrot.h +++ b/mandelbrot/mandelbrot.h @@ -11,7 +11,7 @@ #include #include - #include + #include #include #include @@ -245,12 +245,12 @@ virtual auto generate_mandelbrot_image_engine(std::vector&, std::vector&, - mandelbrot_text_output_base&) -> void = 0; + text_output_base&) -> void = 0; auto generate_mandelbrot_image(const std::string& str_filename, const color::color_functions_base& color_functions = color::color_functions_bw(), const color::color_stretch_base& color_stretches = color::color_stretch_histogram_method(), - mandelbrot_text_output_base& text_output = my_standard_output) -> void + text_output_base& text_output = my_standard_output) -> void { // Setup the x-axis and y-axis coordinates. @@ -277,7 +277,7 @@ const mandelbrot_config_type& mandelbrot_config_object; // NOLINT(readability-identifier-naming,cppcoreguidelines-non-private-member-variables-in-classes,misc-non-private-member-variables-in-classes) private: - static mandelbrot_text_output_cout my_standard_output; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) + static text_output_cout my_standard_output; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) boost::gil::rgb8_image_t mandelbrot_image { }; // NOLINT(readability-identifier-naming) boost::gil::rgb8_view_t mandelbrot_view { }; // NOLINT(readability-identifier-naming) @@ -351,7 +351,7 @@ template - mandelbrot_text_output_cout mandelbrot_generator::my_standard_output; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables,hicpp-uppercase-literal-suffix,readability-uppercase-literal-suffix) + text_output_cout mandelbrot_generator::my_standard_output; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables,hicpp-uppercase-literal-suffix,readability-uppercase-literal-suffix) #if(__cplusplus >= 201703L) } // namespace ckormanyos::mandelbrot diff --git a/mandelbrot/mandelbrot_color.h b/mandelbrot/mandelbrot_color.h index a53708f..b63e0cd 100644 --- a/mandelbrot/mandelbrot_color.h +++ b/mandelbrot/mandelbrot_color.h @@ -11,6 +11,18 @@ #include #include + #if !defined(MANDELBROT_NODISCARD) + #if defined(_MSC_VER) && !defined(__GNUC__) + #define MANDELBROT_NODISCARD + #else + #if (defined(__cplusplus) && (__cplusplus >= 201703L)) + #define MANDELBROT_NODISCARD [[nodiscard]] // NOLINT(cppcoreguidelines-macro-usage) + #else + #define MANDELBROT_NODISCARD + #endif + #endif + #endif + #if(__cplusplus >= 201703L) namespace ckormanyos::mandelbrot::color { #else diff --git a/mandelbrot/mandelbrot_generator_perturbative.h b/mandelbrot/mandelbrot_generator_perturbative.h index e3781d8..99e3bb6 100644 --- a/mandelbrot/mandelbrot_generator_perturbative.h +++ b/mandelbrot/mandelbrot_generator_perturbative.h @@ -54,7 +54,7 @@ auto generate_mandelbrot_image_engine(std::vector& x_coord, // NOLINT(misc-unused-parameters) std::vector& y_coord, // NOLINT(misc-unused-parameters) - mandelbrot_text_output_base& text_output) -> void override + text_output_base& text_output) -> void override { std::vector zkr(base_class_type::get_iterations() + static_cast(UINT8_C(1))); // NOLINT(cppcoreguidelines-init-variables) std::vector zki(base_class_type::get_iterations() + static_cast(UINT8_C(1))); // NOLINT(cppcoreguidelines-init-variables) diff --git a/mandelbrot/mandelbrot_generator_trivial.h b/mandelbrot/mandelbrot_generator_trivial.h index 3467780..91a8fdb 100644 --- a/mandelbrot/mandelbrot_generator_trivial.h +++ b/mandelbrot/mandelbrot_generator_trivial.h @@ -52,7 +52,7 @@ auto generate_mandelbrot_image_engine(std::vector& x_coord, std::vector& y_coord, - mandelbrot_text_output_base& text_output) -> void override + text_output_base& text_output) -> void override { // Initialize the x-y coordinates. { @@ -165,4 +165,4 @@ } // namespace ckormanyos #endif -#endif // MANDELBROT_2015_06_15_H +#endif // MANDELBROT_GENERATOR_TRIVIAL_2024_04_28_H diff --git a/mandelbrot/mandelbrot_text_output.h b/mandelbrot/text_output.h similarity index 59% rename from mandelbrot/mandelbrot_text_output.h rename to mandelbrot/text_output.h index c88d2ee..0e5a31c 100644 --- a/mandelbrot/mandelbrot_text_output.h +++ b/mandelbrot/text_output.h @@ -5,8 +5,8 @@ // or copy at http://www.boost.org/LICENSE_1_0.txt) // -#ifndef MANDELBROT_TEXT_OUTPUT_2024_04_14_H // NOLINT(llvm-header-guard) - #define MANDELBROT_TEXT_OUTPUT_2024_04_14_H +#ifndef TEXT_OUTPUT_2024_04_14_H // NOLINT(llvm-header-guard) + #define TEXT_OUTPUT_2024_04_14_H #include #include @@ -18,21 +18,23 @@ namespace ckormanyos { namespace mandelbrot { #endif - class mandelbrot_text_output_base // NOLINT(cppcoreguidelines-special-member-functions,hicpp-special-member-functions) + class text_output_base // NOLINT(cppcoreguidelines-special-member-functions,hicpp-special-member-functions) { public: - virtual ~mandelbrot_text_output_base() = default; + virtual ~text_output_base() = default; virtual auto write(const std::string&) -> bool = 0; protected: - mandelbrot_text_output_base() = default; + using callback_function_type = auto(*)(const std::string&) -> bool; + + text_output_base() = default; }; - class mandelbrot_text_output_cout : public mandelbrot_text_output_base // NOLINT(cppcoreguidelines-special-member-functions,hicpp-special-member-functions) + class text_output_cout : public text_output_base // NOLINT(cppcoreguidelines-special-member-functions,hicpp-special-member-functions) { public: - ~mandelbrot_text_output_cout() override = default; + ~text_output_cout() override = default; auto write(const std::string& str_to_write) -> bool override { @@ -49,4 +51,4 @@ } // namespace ckormanyos #endif -#endif // MANDELBROT_TEXT_OUTPUT_2024_04_14_H +#endif // TEXT_OUTPUT_2024_04_14_H diff --git a/mandelbrot_vs2022.vcxproj b/mandelbrot_vs2022.vcxproj index 83074d7..9caaf57 100644 --- a/mandelbrot_vs2022.vcxproj +++ b/mandelbrot_vs2022.vcxproj @@ -138,7 +138,7 @@ - + @@ -146,7 +146,6 @@ - diff --git a/mandelbrot_vs2022.vcxproj.filters b/mandelbrot_vs2022.vcxproj.filters index f351043..7a24481 100644 --- a/mandelbrot_vs2022.vcxproj.filters +++ b/mandelbrot_vs2022.vcxproj.filters @@ -132,9 +132,6 @@ Source Files\mandelbrot - - Source Files\mandelbrot - Source Files\mandelbrot\cfg @@ -144,6 +141,9 @@ Source Files\mandelbrot\cfg + + Source Files\mandelbrot + @@ -151,7 +151,6 @@ -