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 | 888 | { \ |
22 | 888 | size_t ret = (*f)(ptr, sizeof(*(ptr)), n); \ |
23 | 888 | FAISS_THROW_IF_NOT_FMT( \ |
24 | 888 | ret == (n), \ |
25 | 888 | "read error in %s: %zd != %zd (%s)", \ |
26 | 888 | f->name.c_str(), \ |
27 | 888 | ret, \ |
28 | 888 | size_t(n), \ |
29 | 888 | strerror(errno)); \ |
30 | 888 | } |
31 | | |
32 | 562 | #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 | 127 | { \ |
43 | 127 | size_t size; \ |
44 | 127 | READANDCHECK(&size, 1); \ |
45 | 127 | FAISS_THROW_IF_NOT(size >= 0 && size < (uint64_t{1} << 40)); \ |
46 | 127 | (vec).resize(size); \ |
47 | 127 | READANDCHECK((vec).data(), size); \ |
48 | 127 | } |
49 | | |
50 | | #define WRITEANDCHECK(ptr, n) \ |
51 | 1.04k | { \ |
52 | 1.04k | size_t ret = (*f)(ptr, sizeof(*(ptr)), n); \ |
53 | 1.04k | FAISS_THROW_IF_NOT_FMT( \ |
54 | 1.04k | ret == (n), \ |
55 | 1.04k | "write error in %s: %zd != %zd (%s)", \ |
56 | 1.04k | f->name.c_str(), \ |
57 | 1.04k | ret, \ |
58 | 1.04k | size_t(n), \ |
59 | 1.04k | strerror(errno)); \ |
60 | 1.04k | } |
61 | | |
62 | 657 | #define WRITE1(x) WRITEANDCHECK(&(x), 1) |
63 | | |
64 | | #define WRITEVECTOR(vec) \ |
65 | 152 | { \ |
66 | 152 | size_t size = (vec).size(); \ |
67 | 152 | WRITEANDCHECK(&size, 1); \ |
68 | 152 | WRITEANDCHECK((vec).data(), size); \ |
69 | 152 | } |
70 | | |
71 | | // read/write xb vector for backwards compatibility of IndexFlat |
72 | | |
73 | | #define WRITEXBVECTOR(vec) \ |
74 | 29 | { \ |
75 | 29 | FAISS_THROW_IF_NOT((vec).size() % 4 == 0); \ |
76 | 29 | size_t size = (vec).size() / 4; \ |
77 | 29 | WRITEANDCHECK(&size, 1); \ |
78 | 29 | WRITEANDCHECK((vec).data(), size * 4); \ |
79 | 29 | } |
80 | | |
81 | | #define READXBVECTOR(vec) \ |
82 | 24 | { \ |
83 | 24 | size_t size; \ |
84 | 24 | READANDCHECK(&size, 1); \ |
85 | 24 | FAISS_THROW_IF_NOT(size >= 0 && size < (uint64_t{1} << 40)); \ |
86 | 24 | size *= 4; \ |
87 | 24 | (vec).resize(size); \ |
88 | 24 | READANDCHECK((vec).data(), size); \ |
89 | 24 | } |