contrib/faiss/faiss/impl/io_macros.h
Line | Count | Source |
1 | | /* |
2 | | * Copyright (c) Meta Platforms, Inc. and affiliates. |
3 | | * |
4 | | * This source code is licensed under the MIT license found in the |
5 | | * LICENSE file in the root directory of this source tree. |
6 | | */ |
7 | | |
8 | | #pragma once |
9 | | |
10 | | #include <faiss/impl/maybe_owned_vector.h> |
11 | | |
12 | | /************************************************************* |
13 | | * I/O macros |
14 | | * |
15 | | * we use macros so that we have a line number to report in abort |
16 | | * (). This makes debugging a lot easier. The IOReader or IOWriter is |
17 | | * always called f and thus is not passed in as a macro parameter. |
18 | | **************************************************************/ |
19 | | |
20 | | #define READANDCHECK(ptr, n) \ |
21 | 826 | { \ |
22 | 826 | size_t ret = (*f)(ptr, sizeof(*(ptr)), n); \ |
23 | 826 | FAISS_THROW_IF_NOT_FMT( \ |
24 | 826 | ret == (n), \ |
25 | 826 | "read error in %s: %zd != %zd (%s)", \ |
26 | 826 | f->name.c_str(), \ |
27 | 826 | ret, \ |
28 | 826 | size_t(n), \ |
29 | 826 | strerror(errno)); \ |
30 | 826 | } |
31 | | |
32 | 520 | #define READ1(x) READANDCHECK(&(x), 1) |
33 | | |
34 | | #define READ1_DUMMY(x_type) \ |
35 | 20 | { \ |
36 | 20 | x_type x = {}; \ |
37 | 20 | READ1(x); \ |
38 | 20 | } |
39 | | |
40 | | // will fail if we write 256G of data at once... |
41 | | #define READVECTOR(vec) \ |
42 | 119 | { \ |
43 | 119 | size_t size; \ |
44 | 119 | READANDCHECK(&size, 1); \ |
45 | 119 | FAISS_THROW_IF_NOT(size >= 0 && size < (uint64_t{1} << 40)); \ |
46 | 119 | (vec).resize(size); \ |
47 | 119 | READANDCHECK((vec).data(), size); \ |
48 | 119 | } |
49 | | |
50 | | #define WRITEANDCHECK(ptr, n) \ |
51 | 981 | { \ |
52 | 981 | size_t ret = (*f)(ptr, sizeof(*(ptr)), n); \ |
53 | 981 | FAISS_THROW_IF_NOT_FMT( \ |
54 | 981 | ret == (n), \ |
55 | 981 | "write error in %s: %zd != %zd (%s)", \ |
56 | 981 | f->name.c_str(), \ |
57 | 981 | ret, \ |
58 | 981 | size_t(n), \ |
59 | 981 | strerror(errno)); \ |
60 | 981 | } |
61 | | |
62 | 615 | #define WRITE1(x) WRITEANDCHECK(&(x), 1) |
63 | | |
64 | | #define WRITEVECTOR(vec) \ |
65 | 144 | { \ |
66 | 144 | size_t size = (vec).size(); \ |
67 | 144 | WRITEANDCHECK(&size, 1); \ |
68 | 144 | WRITEANDCHECK((vec).data(), size); \ |
69 | 144 | } |
70 | | |
71 | | // read/write xb vector for backwards compatibility of IndexFlat |
72 | | |
73 | | #define WRITEXBVECTOR(vec) \ |
74 | 27 | { \ |
75 | 27 | FAISS_THROW_IF_NOT((vec).size() % 4 == 0); \ |
76 | 27 | size_t size = (vec).size() / 4; \ |
77 | 27 | WRITEANDCHECK(&size, 1); \ |
78 | 27 | WRITEANDCHECK((vec).data(), size * 4); \ |
79 | 27 | } |
80 | | |
81 | | #define READXBVECTOR(vec) \ |
82 | 22 | { \ |
83 | 22 | size_t size; \ |
84 | 22 | READANDCHECK(&size, 1); \ |
85 | 22 | FAISS_THROW_IF_NOT(size >= 0 && size < (uint64_t{1} << 40)); \ |
86 | 22 | size *= 4; \ |
87 | 22 | (vec).resize(size); \ |
88 | 22 | READANDCHECK((vec).data(), size); \ |
89 | 22 | } |