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 | 3.37k | { \ |
22 | 3.37k | size_t ret = (*f)(ptr, sizeof(*(ptr)), n); \ |
23 | 3.37k | FAISS_THROW_IF_NOT_FMT( \ |
24 | 3.37k | ret == (n), \ |
25 | 3.37k | "read error in %s: %zd != %zd (%s)", \ |
26 | 3.37k | f->name.c_str(), \ |
27 | 3.37k | ret, \ |
28 | 3.37k | size_t(n), \ |
29 | 3.37k | strerror(errno)); \ |
30 | 3.37k | } |
31 | | |
32 | 2.08k | #define READ1(x) READANDCHECK(&(x), 1) |
33 | | |
34 | | #define READ1_DUMMY(x_type) \ |
35 | 100 | { \ |
36 | 100 | x_type x = {}; \ |
37 | 100 | READ1(x); \ |
38 | 100 | } |
39 | | |
40 | | // will fail if we write 256G of data at once... |
41 | | #define READVECTOR(vec) \ |
42 | 523 | { \ |
43 | 523 | size_t size; \ |
44 | 523 | READANDCHECK(&size, 1); \ |
45 | 523 | FAISS_THROW_IF_NOT(size >= 0 && size < (uint64_t{1} << 40)); \ |
46 | 523 | (vec).resize(size); \ |
47 | 523 | READANDCHECK((vec).data(), size); \ |
48 | 523 | } |
49 | | |
50 | | #define WRITEANDCHECK(ptr, n) \ |
51 | 2.09k | { \ |
52 | 2.09k | size_t ret = (*f)(ptr, sizeof(*(ptr)), n); \ |
53 | 2.09k | FAISS_THROW_IF_NOT_FMT( \ |
54 | 2.09k | ret == (n), \ |
55 | 2.09k | "write error in %s: %zd != %zd (%s)", \ |
56 | 2.09k | f->name.c_str(), \ |
57 | 2.09k | ret, \ |
58 | 2.09k | size_t(n), \ |
59 | 2.09k | strerror(errno)); \ |
60 | 2.09k | } |
61 | | |
62 | 1.30k | #define WRITE1(x) WRITEANDCHECK(&(x), 1) |
63 | | |
64 | | #define WRITEVECTOR(vec) \ |
65 | 319 | { \ |
66 | 319 | size_t size = (vec).size(); \ |
67 | 319 | WRITEANDCHECK(&size, 1); \ |
68 | 319 | WRITEANDCHECK((vec).data(), size); \ |
69 | 319 | } |
70 | | |
71 | | // read/write xb vector for backwards compatibility of IndexFlat |
72 | | |
73 | | #define WRITEXBVECTOR(vec) \ |
74 | 59 | { \ |
75 | 59 | FAISS_THROW_IF_NOT((vec).size() % 4 == 0); \ |
76 | 59 | size_t size = (vec).size() / 4; \ |
77 | 59 | WRITEANDCHECK(&size, 1); \ |
78 | 59 | WRITEANDCHECK((vec).data(), size * 4); \ |
79 | 59 | } |
80 | | |
81 | | #define READXBVECTOR(vec) \ |
82 | 104 | { \ |
83 | 104 | size_t size; \ |
84 | 104 | READANDCHECK(&size, 1); \ |
85 | 104 | FAISS_THROW_IF_NOT(size >= 0 && size < (uint64_t{1} << 40)); \ |
86 | 104 | size *= 4; \ |
87 | 104 | (vec).resize(size); \ |
88 | 104 | READANDCHECK((vec).data(), size); \ |
89 | 104 | } |