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;
 }