Metall v0.30
A persistent memory allocator for data-centric analytics
 
Loading...
Searching...
No Matches
csr.hpp
Go to the documentation of this file.
1// Copyright 2019 Lawrence Livermore National Security, LLC and other Metall
2// Project Developers. See the top-level COPYRIGHT file for details.
3//
4// SPDX-License-Identifier: (Apache-2.0 OR MIT)
5
6#ifndef METALL_EXAMPLE_GRAPH_DATA_STRUCTURE_CSR_HPP
7#define METALL_EXAMPLE_GRAPH_DATA_STRUCTURE_CSR_HPP
8
9#include <memory>
10#include <metall/metall.hpp>
11
15template <typename index_t = uint64_t, typename vid_t = uint64_t,
16 typename allocator_t = std::allocator<char>>
17class csr {
18 private:
19 // Here, we declare allocator and pointer types we need.
20 // As this data structure can be stored in persistent memory,
21 // we have to use the pointer type the given allocator has
22
23 // Allocator and pointer types for the indices array
24 using index_allocator_t = typename std::allocator_traits<
25 allocator_t>::template rebind_alloc<index_t>;
26 using index_pointer_t =
27 typename std::allocator_traits<index_allocator_t>::pointer;
28
29 // Allocator and pointer types for the edges array
30 using edge_allocator_t =
31 typename std::allocator_traits<allocator_t>::template rebind_alloc<vid_t>;
32 using edge_pointer_t =
33 typename std::allocator_traits<edge_allocator_t>::pointer;
34
35 public:
36 csr(const std::size_t num_vertices, const std::size_t num_edges,
37 allocator_t allocator = allocator_t())
38 : m_num_vertices(num_vertices),
39 m_num_edges(num_edges),
40 m_indices(nullptr),
41 m_edges(nullptr),
42 m_allocator(allocator) {
43 // -- Allocate arrays with dedicated allocators -- //
44 auto index_allocator = index_allocator_t(m_allocator);
45 m_indices = index_allocator.allocate(m_num_vertices + 1);
46 auto edge_allocator = edge_allocator_t(m_allocator);
47 m_edges = edge_allocator.allocate(num_edges);
48 }
49
50 ~csr() {
51 // -- Deallocate arrays with dedicated allocators -- //
52 auto index_allocator = index_allocator_t(m_allocator);
53 index_allocator.deallocate(m_indices, m_num_vertices + 1);
54 auto edge_allocator = edge_allocator_t(m_allocator);
55 edge_allocator.deallocate(m_edges, m_num_edges);
56 }
57
59 index_t *indices() {
60 return metall::to_raw_pointer(m_indices);
61 // return std::pointer_traits<char_pointer_t>::to_address(m_indices); //
62 // From C++20
63 }
64
66 vid_t *edges() {
67 return metall::to_raw_pointer(m_edges);
68 // return std::pointer_traits<char_pointer_t>::to_address(m_edges); // From
69 // C++20
70 }
71
72 private:
73 const std::size_t m_num_vertices;
74 const std::size_t m_num_edges;
75 index_pointer_t m_indices;
76 edge_pointer_t m_edges;
77 allocator_t m_allocator;
78};
79
80#endif // METALL_EXAMPLE_GRAPH_DATA_STRUCTURE_CSR_HPP
Simple CSR graph data structure that can take a custom C++ allocator and be stored in persistent memo...
Definition csr.hpp:17
~csr()
Definition csr.hpp:50
vid_t * edges()
Returns a raw pointer to the edges array.
Definition csr.hpp:66
csr(const std::size_t num_vertices, const std::size_t num_edges, allocator_t allocator=allocator_t())
Definition csr.hpp:36
index_t * indices()
Returns a raw pointer to the indices array.
Definition csr.hpp:59