Mercurial > lbo > hg > ccplay
changeset 22:68cf11026c57
work on MDSpan
author | Lewin Bormann <lbo@spheniscida.de> |
---|---|
date | Sun, 09 Apr 2023 12:07:14 +0200 |
parents | ae1327f0f99f |
children | c3fb5f666e2d |
files | .clangd CMakeLists.txt graph.cc sorting.cc |
diffstat | 4 files changed, 79 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/.clangd Fri Apr 07 15:50:41 2023 +0200 +++ b/.clangd Sun Apr 09 12:07:14 2023 +0200 @@ -1,2 +1,2 @@ CompileFlags: - Add: [-std=c++20] + Add: [-std=c++23]
--- a/CMakeLists.txt Fri Apr 07 15:50:41 2023 +0200 +++ b/CMakeLists.txt Sun Apr 09 12:07:14 2023 +0200 @@ -3,13 +3,14 @@ SET(CMAKE_CXX_COMPILER g++) -SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++23 -g -Wall") +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++23 -g -Wall -fconcepts-diagnostics-depth=2") ADD_SUBDIRECTORY(lib) LINK_LIBRARIES(fmt) ADD_EXECUTABLE(arrays arrays.cc) ADD_EXECUTABLE(cclib cclib.cc) ADD_EXECUTABLE(dynprog dynprog.cc) +ADD_EXECUTABLE(graph graph.cc) ADD_EXECUTABLE(sorting sorting.cc) ADD_EXECUTABLE(time time.cc) ADD_EXECUTABLE(wordcount wordcount.cc) @@ -17,6 +18,7 @@ TARGET_LINK_LIBRARIES(arrays exec) TARGET_LINK_LIBRARIES(cclib exec) TARGET_LINK_LIBRARIES(dynprog exec) +TARGET_LINK_LIBRARIES(graph exec) TARGET_LINK_LIBRARIES(sorting exec) TARGET_LINK_LIBRARIES(time exec) TARGET_LINK_LIBRARIES(wordcount exec)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graph.cc Sun Apr 09 12:07:14 2023 +0200 @@ -0,0 +1,74 @@ +#include "lib/exec.h" + +#include <iterator> +#include <ranges> +#include <vector> + +using namespace std; + +template<typename T, typename Iter> + requires random_access_iterator<Iter> && is_same_v<remove_cv_t<iter_value_t<Iter>>, remove_cv_t<T>> +class MDSpan { + const Iter begin, end; + const size_t Nx, Ny; + + public: + + template<typename R> + requires is_same_v<ranges::iterator_t<R>, Iter> + MDSpan(R&& rng, size_t Nx, size_t Ny) : begin(std::begin(rng)), end(std::end(rng)), Nx(Nx), Ny(Ny) { + if (static_cast<signed long>(Nx * Ny) != end - begin) { + throw string("bad dimensions"); + } + } + + MDSpan(const MDSpan<T, Iter>& other) : begin(other.begin), end(other.end), Nx(other.Nx), Ny(other.Ny) { + fmt::print("copy ctor\n"); + } + + const MDSpan<T, Iter>& operator=(const MDSpan<T, Iter>& other) = delete; + + T& operator[](size_t x, size_t y) { + size_t ix = y * Nx + x; + return begin[ix]; + } +}; + +template<typename Cont> requires ranges::range<Cont> +MDSpan<ranges::range_value_t<Cont>, ranges::iterator_t<Cont>> make_mdspan(Cont&& c, size_t x, size_t y) { + return MDSpan<ranges::range_value_t<Cont>, ranges::iterator_t<Cont>>(c, x, y); +} + +template<typename C> +concept constant_range = requires (C c) { + { c.cbegin() } -> same_as<typename remove_cvref_t<C>::const_iterator>; + { c.cend() } -> same_as<typename remove_cvref_t<C>::const_iterator>; +}; + +// Note: const specialization, uses static member type +template <typename Cont> + requires constant_range<Cont> +MDSpan<const ranges::range_value_t<remove_cvref_t<Cont>>, + typename remove_cvref_t<Cont>::const_iterator> +make_const_mdspan(Cont &&c, size_t x, size_t y) { + return MDSpan<const ranges::range_value_t<remove_cvref_t<Cont>>, + typename remove_cvref_t<Cont>::const_iterator>(c, x, y); +} + +// https://www.techiedelight.com/single-source-shortest-paths-bellman-ford-algorithm/ +void bellman_ford() { + const vector<int> v(42); + + //MDSpan<const int, vector<int>::const_iterator> mds = make_mdspan(v, 6, 7); + auto mds = make_const_mdspan(v, 6, 7); + + //mds[3, 3] = 47; + fmt::print("{}\n", mds[2,3]); + //fmt::print("{}\n", mds[3,3]); +} + +int main(void) { + bellman_ford(); + + return 0; +}
--- a/sorting.cc Fri Apr 07 15:50:41 2023 +0200 +++ b/sorting.cc Sun Apr 09 12:07:14 2023 +0200 @@ -201,7 +201,7 @@ vector<string> v{"hello", "olleh", "abc", "bca", "world", "wrlod"}; vector<int> vi{5,5,6,1,3,2,5,8,9}; - timeit_f([&vi]() { heap_sort(vi); }, "heapsort"); + timeit_f([&]() { heap_sort(vi); }, "heapsort"); fmt::print("{}\n", vi); return 0; }