@@ -923,11 +923,14 @@ class index_gt {
923
923
924
924
static constexpr std::size_t head_bytes () { return sizeof (label_t ) + sizeof (dim_t ) + sizeof (level_t ); }
925
925
926
- struct node_t {
926
+ class node_t {
927
927
byte_t * tape_{};
928
928
scalar_t * vector_{};
929
929
930
+ public:
930
931
explicit node_t (byte_t * tape, scalar_t * vector) noexcept : tape_(tape), vector_(vector) {}
932
+ byte_t * tape () const noexcept { return tape_; }
933
+ scalar_t * vector () const noexcept { return vector_; }
931
934
932
935
node_t () = default ;
933
936
node_t (node_t const &) = default ;
@@ -1127,9 +1130,9 @@ class index_gt {
1127
1130
inline std::size_t size () const noexcept { return count; }
1128
1131
inline search_result_t operator [](std::size_t i) const noexcept {
1129
1132
candidate_t const * top_ordered = top_.data ();
1130
- return {member_cref_t (index_.node (top_ordered[i].id )), top_ordered[i].distance };
1133
+ return {member_cref_t (index_.node (index_. nodes_ [ top_ordered[i].id ] )), top_ordered[i].distance };
1131
1134
}
1132
- inline std::size_t dump_to (label_t * labels, distance_t * distances) noexcept {
1135
+ inline std::size_t dump_to (label_t * labels, distance_t * distances) const noexcept {
1133
1136
for (std::size_t i = 0 ; i != count; ++i) {
1134
1137
search_result_t result = operator [](i);
1135
1138
labels[i] = result.member .label ;
@@ -1453,8 +1456,7 @@ class index_gt {
1453
1456
node_head_t const & head = *(node_head_t const *)(file + progress);
1454
1457
std::size_t bytes_to_dump = node_dump_size (head.dim , head.level );
1455
1458
std::size_t bytes_in_vec = head.dim * sizeof (scalar_t );
1456
- nodes_[i].tape_ = (byte_t *)(file + progress);
1457
- nodes_[i].vector_ = (scalar_t *)(file + progress + bytes_to_dump - bytes_in_vec);
1459
+ nodes_[i] = node_t {(byte_t *)(file + progress), (scalar_t *)(file + progress + bytes_to_dump - bytes_in_vec)};
1458
1460
progress += bytes_to_dump;
1459
1461
max_level_ = (std::max)(max_level_, head.level );
1460
1462
}
@@ -1487,20 +1489,17 @@ class index_gt {
1487
1489
1488
1490
// This function is rarely called and can be as expensive as needed for higher space-efficiency.
1489
1491
node_t & node = nodes_[id];
1490
- if (!node.tape_ )
1491
- return ;
1492
-
1493
- node_head_t const & head = *(node_head_t const *)(node.tape_ + pre_.mutex_bytes );
1492
+ node_head_t const & head = *(node_head_t const *)(node.tape () + pre_.mutex_bytes );
1494
1493
std::size_t levels_bytes = pre_.neighbors_base_bytes + pre_.neighbors_bytes * head.level ;
1495
- bool store_vector = (byte_t *)(node.tape_ + pre_.mutex_bytes + head_bytes () + levels_bytes) == //
1496
- (byte_t *)(node.vector_ );
1494
+ bool store_vector = (byte_t *)(node.tape () + pre_.mutex_bytes + head_bytes () + levels_bytes) == //
1495
+ (byte_t *)(node.vector () );
1497
1496
std::size_t node_bytes = //
1498
1497
pre_.mutex_bytes + // Optional concurrency-control
1499
1498
head_bytes () + levels_bytes + // Obligatory neighborhood index
1500
1499
head.dim * store_vector // Optional vector copy
1501
1500
;
1502
1501
1503
- allocator_t {}.deallocate (node.tape_ , node_bytes);
1502
+ allocator_t {}.deallocate (node.tape () , node_bytes);
1504
1503
node = node_t {};
1505
1504
}
1506
1505
@@ -1537,10 +1536,10 @@ class index_gt {
1537
1536
inline node_ref_t node (id_t id) const noexcept { return node (nodes_[id]); }
1538
1537
1539
1538
inline node_ref_t node (node_t node) const noexcept {
1540
- byte_t * data = node.tape_ ;
1539
+ byte_t * data = node.tape () ;
1541
1540
mutex_t * mutex = synchronize () ? (mutex_t *)data : nullptr ;
1542
1541
node_head_t & head = *(node_head_t *)(data + pre_.mutex_bytes );
1543
- scalar_t * scalars = node.vector_ ;
1542
+ scalar_t * scalars = node.vector () ;
1544
1543
1545
1544
return {*mutex, head, scalars};
1546
1545
}
0 commit comments