mirror of
https://github.com/facebookresearch/faiss.git
synced 2025-06-03 21:54:02 +08:00
Summary: ### Description - Create custom readers and writers for index IO, which take function pointers as input - Also expose these from the C_API This is helpful for FFI use, where calling processes would pass upcall stubs for streamlined IO Pull Request resolved: https://github.com/facebookresearch/faiss/pull/4180 Reviewed By: gtwang01 Differential Revision: D71208266 Pulled By: mnorris11 fbshipit-source-id: ab82397d4780a2a07c7bfdc52329968377f42af4
77 lines
2.1 KiB
C++
77 lines
2.1 KiB
C++
/*
|
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*/
|
|
|
|
// -*- c++ -*-
|
|
|
|
#include "io_c.h"
|
|
#include <faiss/impl/io.h>
|
|
#include "../macros_impl.h"
|
|
|
|
using faiss::IOReader;
|
|
using faiss::IOWriter;
|
|
|
|
struct CustomIOReader : IOReader {
|
|
size_t (*func)(void* ptr, size_t size, size_t nitems) = nullptr;
|
|
|
|
CustomIOReader(size_t (*func_in)(void* ptr, size_t size, size_t nitems));
|
|
|
|
size_t operator()(void* ptr, size_t size, size_t nitems) override;
|
|
};
|
|
|
|
CustomIOReader::CustomIOReader(
|
|
size_t (*func_in)(void* ptr, size_t size, size_t nitems))
|
|
: func(func_in) {}
|
|
|
|
size_t CustomIOReader::operator()(void* ptr, size_t size, size_t nitems) {
|
|
return func(ptr, size, nitems);
|
|
}
|
|
|
|
int faiss_CustomIOReader_new(
|
|
FaissCustomIOReader** p_out,
|
|
size_t (*func_in)(void* ptr, size_t size, size_t nitems)) {
|
|
try {
|
|
*p_out = reinterpret_cast<FaissCustomIOReader*>(
|
|
new CustomIOReader(func_in));
|
|
}
|
|
CATCH_AND_HANDLE
|
|
}
|
|
|
|
void faiss_CustomIOReader_free(FaissCustomIOReader* obj) {
|
|
delete reinterpret_cast<CustomIOReader*>(obj);
|
|
}
|
|
|
|
struct CustomIOWriter : IOWriter {
|
|
size_t (*func)(const void* ptr, size_t size, size_t nitems) = nullptr;
|
|
|
|
CustomIOWriter(
|
|
size_t (*func_in)(const void* ptr, size_t size, size_t nitems));
|
|
|
|
size_t operator()(const void* ptr, size_t size, size_t nitems) override;
|
|
};
|
|
|
|
CustomIOWriter::CustomIOWriter(
|
|
size_t (*func_in)(const void* ptr, size_t size, size_t nitems))
|
|
: func(func_in) {}
|
|
|
|
size_t CustomIOWriter::operator()(const void* ptr, size_t size, size_t nitems) {
|
|
return func(ptr, size, nitems);
|
|
}
|
|
|
|
int faiss_CustomIOWriter_new(
|
|
FaissCustomIOWriter** p_out,
|
|
size_t (*func_in)(const void* ptr, size_t size, size_t nitems)) {
|
|
try {
|
|
*p_out = reinterpret_cast<FaissCustomIOWriter*>(
|
|
new CustomIOWriter(func_in));
|
|
}
|
|
CATCH_AND_HANDLE
|
|
}
|
|
|
|
void faiss_CustomIOWriter_free(FaissCustomIOWriter* obj) {
|
|
delete reinterpret_cast<CustomIOWriter*>(obj);
|
|
}
|