From 86982765cffee51a854111623fe1024a2a92c9f7 Mon Sep 17 00:00:00 2001 From: Gammasoft Date: Mon, 6 Jan 2025 20:32:28 +0100 Subject: [PATCH] Add xtd::linq::enumerable examples and documentation --- examples/xtd.core.examples/README.md | 2 + .../xtd.core.examples/linq/CMakeLists.txt | 2 + examples/xtd.core.examples/linq/README.md | 2 + .../enumerable_count/src/enumerable_count.cpp | 1 - .../CMakeLists.txt | 6 +++ .../enumerable_default_if_empty/README.md | 28 +++++++++++++ .../src/enumerable_default_if_empty.cpp | 37 +++++++++++++++++ .../CMakeLists.txt | 6 +++ .../enumerable_default_if_empty2/README.md | 28 +++++++++++++ .../src/enumerable_default_if_empty2.cpp | 41 +++++++++++++++++++ src/xtd.core/include/xtd/linq/enumerable.hpp | 6 +++ 11 files changed, 158 insertions(+), 1 deletion(-) create mode 100644 examples/xtd.core.examples/linq/enumerable_default_if_empty/CMakeLists.txt create mode 100644 examples/xtd.core.examples/linq/enumerable_default_if_empty/README.md create mode 100644 examples/xtd.core.examples/linq/enumerable_default_if_empty/src/enumerable_default_if_empty.cpp create mode 100644 examples/xtd.core.examples/linq/enumerable_default_if_empty2/CMakeLists.txt create mode 100644 examples/xtd.core.examples/linq/enumerable_default_if_empty2/README.md create mode 100644 examples/xtd.core.examples/linq/enumerable_default_if_empty2/src/enumerable_default_if_empty2.cpp diff --git a/examples/xtd.core.examples/README.md b/examples/xtd.core.examples/README.md index 8667d2c3c47..a9093d0b6c8 100644 --- a/examples/xtd.core.examples/README.md +++ b/examples/xtd.core.examples/README.md @@ -282,6 +282,8 @@ * [enumerable_count](linq/enumerable_count/README.md) shows how to use [xtd::linq::enumerable::count](https://gammasoft71.github.io/xtd/reference_guides/latest/classxtd_1_1linq_1_1enumerable.html#ae8deab4a1605619cb40cd56504a5b54c) method. * [enumerable_count2](linq/enumerable_count2/README.md) shows how to use [xtd::linq::enumerable::count](https://gammasoft71.github.io/xtd/reference_guides/latest/classxtd_1_1linq_1_1enumerable.html#ad9b2c99b2315f698741d2f45b0d4db92) method. * [enumerable_count_by](linq/enumerable_count_by/README.md) shows how to use [xtd::linq::enumerable::count_by](https://gammasoft71.github.io/xtd/reference_guides/latest/classxtd_1_1linq_1_1enumerable.html#a6cda69ae32d618aa9d31e18133861f45) method. +* [enumerable_default_if_empty](linq/enumerable_default_if_empty/README.md) shows how to use [xtd::linq::enumerable::default_if_empty](https://gammasoft71.github.io/xtd/reference_guides/latest/classxtd_1_1linq_1_1enumerable.html#a89cb4c7f69e1af47e2d24c5e4e963925) method. +* [enumerable_default_if_empty2](linq/enumerable_default_if_empty2/README.md) shows how to use [xtd::linq::enumerable::default_if_empty](https://gammasoft71.github.io/xtd/reference_guides/latest/classxtd_1_1linq_1_1enumerable.html#a77cd5c4f6280710bd7422cb5bb6ca0d1) method. * [enumerable_range](linq/enumerable_range/README.md) shows how to use [xtd::linq::enumerable::range](https://gammasoft71.github.io/xtd/reference_guides/latest/classxtd_1_1linq_1_1enumerable.html#a2ad0f9812852378c4ed08a50f39396cd) method. * [enumerable_select](linq/enumerable_select/README.md) shows how to use [xtd::linq::enumerable::select](https://gammasoft71.github.io/xtd/reference_guides/latest/classxtd_1_1linq_1_1enumerable.html#ae2df9541f109773859bcaaf42015b8cd) method. * [enumerable_select2](linq/enumerable_select2/README.md) shows how to use [xtd::linq::enumerable::select](https://gammasoft71.github.io/xtd/reference_guides/latest/classxtd_1_1linq_1_1enumerable.html#ae2df9541f109773859bcaaf42015b8cd) method. diff --git a/examples/xtd.core.examples/linq/CMakeLists.txt b/examples/xtd.core.examples/linq/CMakeLists.txt index 0e6497558a1..b2139f78819 100644 --- a/examples/xtd.core.examples/linq/CMakeLists.txt +++ b/examples/xtd.core.examples/linq/CMakeLists.txt @@ -21,6 +21,8 @@ add_projects( enumerable_count enumerable_count2 enumerable_count_by + enumerable_default_if_empty + enumerable_default_if_empty2 enumerable_range enumerable_select enumerable_select2 diff --git a/examples/xtd.core.examples/linq/README.md b/examples/xtd.core.examples/linq/README.md index 29c73f0b1e4..a4046acbed4 100644 --- a/examples/xtd.core.examples/linq/README.md +++ b/examples/xtd.core.examples/linq/README.md @@ -19,6 +19,8 @@ * [enumerable_count](enumerable_count/README.md) shows how to use [xtd::linq::enumerable::count](https://gammasoft71.github.io/xtd/reference_guides/latest/classxtd_1_1linq_1_1enumerable.html#ae8deab4a1605619cb40cd56504a5b54c) method. * [enumerable_count2](enumerable_count2/README.md) shows how to use [xtd::linq::enumerable::count](https://gammasoft71.github.io/xtd/reference_guides/latest/classxtd_1_1linq_1_1enumerable.html#ad9b2c99b2315f698741d2f45b0d4db92) method. * [enumerable_count_by](enumerable_count_by/README.md) shows how to use [xtd::linq::enumerable::count_by](https://gammasoft71.github.io/xtd/reference_guides/latest/classxtd_1_1linq_1_1enumerable.html#a6cda69ae32d618aa9d31e18133861f45) method. +* [enumerable_default_if_empty](enumerable_default_if_empty/README.md) shows how to use [xtd::linq::enumerable::default_if_empty](https://gammasoft71.github.io/xtd/reference_guides/latest/classxtd_1_1linq_1_1enumerable.html#a89cb4c7f69e1af47e2d24c5e4e963925) method. +* [enumerable_default_if_empty2](enumerable_default_if_empty2/README.md) shows how to use [xtd::linq::enumerable::default_if_empty](https://gammasoft71.github.io/xtd/reference_guides/latest/classxtd_1_1linq_1_1enumerable.html#a77cd5c4f6280710bd7422cb5bb6ca0d1) method. * [enumerable_range](enumerable_range/README.md) shows how to use [xtd::linq::enumerable::range](https://gammasoft71.github.io/xtd/reference_guides/latest/classxtd_1_1linq_1_1enumerable.html#a2ad0f9812852378c4ed08a50f39396cd) method. * [enumerable_select](enumerable_select/README.md) shows how to use [xtd::linq::enumerable::select](https://gammasoft71.github.io/xtd/reference_guides/latest/classxtd_1_1linq_1_1enumerable.html#ae2df9541f109773859bcaaf42015b8cd) method. * [enumerable_select2](enumerable_select2/README.md) shows how to use [xtd::linq::enumerable::select](https://gammasoft71.github.io/xtd/reference_guides/latest/classxtd_1_1linq_1_1enumerable.html#ae2df9541f109773859bcaaf42015b8cd) method. diff --git a/examples/xtd.core.examples/linq/enumerable_count/src/enumerable_count.cpp b/examples/xtd.core.examples/linq/enumerable_count/src/enumerable_count.cpp index 57dc741c2e2..663d521056c 100644 --- a/examples/xtd.core.examples/linq/enumerable_count/src/enumerable_count.cpp +++ b/examples/xtd.core.examples/linq/enumerable_count/src/enumerable_count.cpp @@ -1,7 +1,6 @@ #include using namespace xtd; -using namespace xtd::collections::generic; auto main() -> int { auto fruits = array {"apple", "banana", "mango", "orange", "passionfruit", "grape"}; diff --git a/examples/xtd.core.examples/linq/enumerable_default_if_empty/CMakeLists.txt b/examples/xtd.core.examples/linq/enumerable_default_if_empty/CMakeLists.txt new file mode 100644 index 00000000000..ff49caa0b1e --- /dev/null +++ b/examples/xtd.core.examples/linq/enumerable_default_if_empty/CMakeLists.txt @@ -0,0 +1,6 @@ +cmake_minimum_required(VERSION 3.20) + +project(enumerable_default_if_empty) +find_package(xtd REQUIRED) +add_sources(README.md src/enumerable_default_if_empty.cpp) +target_type(CONSOLE_APPLICATION) diff --git a/examples/xtd.core.examples/linq/enumerable_default_if_empty/README.md b/examples/xtd.core.examples/linq/enumerable_default_if_empty/README.md new file mode 100644 index 00000000000..69ef3e89644 --- /dev/null +++ b/examples/xtd.core.examples/linq/enumerable_default_if_empty/README.md @@ -0,0 +1,28 @@ +# enumerable_default_if_empty + +Shows how to use [xtd::linq::enumerable::default_if_empty](https://gammasoft71.github.io/xtd/reference_guides/latest/classxtd_1_1linq_1_1enumerable.html#a89cb4c7f69e1af47e2d24c5e4e963925) method. + +## Sources + +[src/enumerable_default_if_empty.cpp](src/enumerable_default_if_empty.cpp) + +[CMakeLists.txt](CMakeLists.txt) + +## Build and run + +Open "Command Prompt" or "Terminal". Navigate to the folder that contains the project and type the following: + +```cmake +xtdc run +``` + +## Output + +``` +pet {name=Barley, age=8} +pet {name=Boots, age=4} +pet {name=Whiskers, age=1} + +pet {name=, age=0} + +``` diff --git a/examples/xtd.core.examples/linq/enumerable_default_if_empty/src/enumerable_default_if_empty.cpp b/examples/xtd.core.examples/linq/enumerable_default_if_empty/src/enumerable_default_if_empty.cpp new file mode 100644 index 00000000000..7da7e350d3d --- /dev/null +++ b/examples/xtd.core.examples/linq/enumerable_default_if_empty/src/enumerable_default_if_empty.cpp @@ -0,0 +1,37 @@ +#include + +using namespace xtd; + +struct pet { + string name; + int age = 0; + + friend bool operator==(const pet& lhs, const pet& rhs) noexcept { + return lhs.name == rhs.name && lhs.age == rhs.age; + } +}; + +auto main() -> int { + auto pets1 = array { + {.name = "Barley", .age = 8}, + {.name = "Boots", .age = 4}, + {.name = "Whiskers", .age = 1} + }; + for (const auto& [name, age] : pets1.default_if_empty()) + console::write_line("pet {{name={}, age={}}}", name, age); + console::write_line(); + + auto pets2 = array {}; + for (const auto& [name, age] : pets2.default_if_empty()) + console::write_line("pet {{name={}, age={}}}", name, age); + console::write_line(); +} + +// This code produces the following output : +// +// pet {name=Barley, age=8} +// pet {name=Boots, age=4} +// pet {name=Whiskers, age=1} +// +// pet {name=, age=0} +// diff --git a/examples/xtd.core.examples/linq/enumerable_default_if_empty2/CMakeLists.txt b/examples/xtd.core.examples/linq/enumerable_default_if_empty2/CMakeLists.txt new file mode 100644 index 00000000000..f4dbaebc5f7 --- /dev/null +++ b/examples/xtd.core.examples/linq/enumerable_default_if_empty2/CMakeLists.txt @@ -0,0 +1,6 @@ +cmake_minimum_required(VERSION 3.20) + +project(enumerable_default_if_empty2) +find_package(xtd REQUIRED) +add_sources(README.md src/enumerable_default_if_empty2.cpp) +target_type(CONSOLE_APPLICATION) diff --git a/examples/xtd.core.examples/linq/enumerable_default_if_empty2/README.md b/examples/xtd.core.examples/linq/enumerable_default_if_empty2/README.md new file mode 100644 index 00000000000..642f16415d8 --- /dev/null +++ b/examples/xtd.core.examples/linq/enumerable_default_if_empty2/README.md @@ -0,0 +1,28 @@ +# enumerable_default_if_empty2 + +Shows how to use [xtd::linq::enumerable::default_if_empty](https://gammasoft71.github.io/xtd/reference_guides/latest/classxtd_1_1linq_1_1enumerable.html#a77cd5c4f6280710bd7422cb5bb6ca0d1) method. + +## Sources + +[src/enumerable_default_if_empty2.cpp](src/enumerable_default_if_empty2.cpp) + +[CMakeLists.txt](CMakeLists.txt) + +## Build and run + +Open "Command Prompt" or "Terminal". Navigate to the folder that contains the project and type the following: + +```cmake +xtdc run +``` + +## Output + +``` +pet {name=Barley, age=8} +pet {name=Boots, age=4} +pet {name=Whiskers, age=1} + +pet {name=Default pet, age=0} + +``` diff --git a/examples/xtd.core.examples/linq/enumerable_default_if_empty2/src/enumerable_default_if_empty2.cpp b/examples/xtd.core.examples/linq/enumerable_default_if_empty2/src/enumerable_default_if_empty2.cpp new file mode 100644 index 00000000000..af60ec302f5 --- /dev/null +++ b/examples/xtd.core.examples/linq/enumerable_default_if_empty2/src/enumerable_default_if_empty2.cpp @@ -0,0 +1,41 @@ +#include + +using namespace xtd; + +struct pet { + string name; + int age = 0; + + static pet default_pet; + + friend bool operator==(const pet& lhs, const pet& rhs) noexcept { + return lhs.name == rhs.name && lhs.age == rhs.age; + } +}; + +pet pet::default_pet {.name = "Default pet", .age = 0}; + +auto main() -> int { + auto pets1 = array { + {.name = "Barley", .age = 8}, + {.name = "Boots", .age = 4}, + {.name = "Whiskers", .age = 1} + }; + for (const auto& [name, age] : pets1.default_if_empty(pet::default_pet)) + console::write_line("pet {{name={}, age={}}}", name, age); + console::write_line(); + + auto pets2 = array {}; + for (const auto& [name, age] : pets2.default_if_empty(pet::default_pet)) + console::write_line("pet {{name={}, age={}}}", name, age); + console::write_line(); +} + +// This code produces the following output : +// +// pet {name=Barley, age=8} +// pet {name=Boots, age=4} +// pet {name=Whiskers, age=1} +// +// pet {name=Default pet, age=0} +// diff --git a/src/xtd.core/include/xtd/linq/enumerable.hpp b/src/xtd.core/include/xtd/linq/enumerable.hpp index def1120ac30..01e10403d22 100644 --- a/src/xtd.core/include/xtd/linq/enumerable.hpp +++ b/src/xtd.core/include/xtd/linq/enumerable.hpp @@ -494,6 +494,9 @@ namespace xtd { /// @tparam source_t The type of the elements of source. /// @param source The sequence to return a default value for if it is empty. /// @return An xtd::collection::generic::ienumerable that contains default_value if source is empty; otherwise, source. + /// @par Examples + /// The following code example demonstrates how to use xtd::linq::enumerable::default_if_empty (const ienumerable &) to return a default value if a sequence is empty. + /// @include enumerable_default_if_empty.cpp template static const ienumerable& default_if_empty(const ienumerable& source) noexcept { return default_if_empty(source, source_t {}); @@ -504,6 +507,9 @@ namespace xtd { /// @param source The sequence to return a default value for if it is empty. /// @param default_value The value to return if the sequence is empty. /// @return An xtd::collection::generic::ienumerable that contains default_value if source is empty; otherwise, source. + /// @par Examples + /// The following code example demonstrates how to use xtd::linq::enumerable::default_if_empty (const ienumerable &, const source_t&) to return a default value if a sequence is empty. + /// @include enumerable_default_if_empty2.cpp template static const ienumerable& default_if_empty(const ienumerable& source, const source_t& default_value) noexcept { static thread_local auto result = enumerable_collection {};