Ты почти понял.Действительно, для индексов заказов вы можете запросить ключ частичный .Поскольку поля являются регулярными целочисленными типами, довольно просто придумать хорошую нижнюю и верхнюю границу:
auto range = boost::make_iterator_range(
view.lower_bound(boost::make_tuple(UID, 501, 6)),
view.lower_bound(boost::make_tuple(UID+1)));
Вот полная демонстрация:
Live On Coliru
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/member.hpp>
#include <boost/multi_index/composite_key.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/interprocess/allocators/allocator.hpp>
#include <boost/interprocess/managed_mapped_file.hpp> // for Coliru
#include <boost/range/iterator_range.hpp>
#include <iostream>
namespace bmi = boost::multi_index;
namespace bip = boost::interprocess;
struct TPQ {
int UID = 0;
int Value = 0;
int Rank = 0;
TPQ() = default;
TPQ(int _T, int _V, int _R) : UID(_T), Value(_V), Rank(_R) {}
};
static inline std::ostream& operator<<(std::ostream& os, TPQ const& tpq) {
return os << "{ UID: " << tpq.UID
<< ", Value: " << tpq.Value
<< ", Rank: " << tpq.Rank << "}";
}
using shared_struct_allocator = bip::allocator<TPQ, bip::managed_mapped_file::segment_manager>;
using Rank_Set = bmi::multi_index_container<
TPQ,
bmi::indexed_by<
bmi::ordered_unique<
bmi::tag<struct RankFilterView>,
bmi::composite_key<TPQ,
bmi::member<TPQ, int, &TPQ::UID>,
bmi::member<TPQ, int, &TPQ::Value>,
bmi::member<TPQ, int, &TPQ::Rank>
>
>
>,
shared_struct_allocator>;
using Rank_view = bmi::index<Rank_Set, RankFilterView>::type;
int main() {
bip::managed_mapped_file segment(bip::open_or_create, "RANKSOTRE", 10*1024);
auto& table = *segment.find_or_construct<Rank_Set>("RANKDATARECORD")(segment.get_segment_manager());
table.insert({
{52478, 501, 6}, // Match!
{52478, 500, 6}, // - Value too small
{52479, 0, 0}, // - UID too high
{52478, 502, 6}, // Match!
{52478, 502, 7}, // Match!
{52478, 501, 5}, // - Rank too small
{52477, 502, 7}, // - UID too small
{52478, 999, 9}, // Match!
});
int UID = 52478;
Rank_view& view = table.get<RankFilterView>();
auto range = boost::make_iterator_range(
view.lower_bound(boost::make_tuple(UID, 501, 6)),
view.upper_bound(UID));
for (TPQ const& tpq : range) {
std::cout << tpq << "\n";
}
}
, который будет печататься только так, как ожидается:
{ UID: 52478, Value: 501, Rank: 6}
{ UID: 52478, Value: 502, Rank: 6}
{ UID: 52478, Value: 502, Rank: 7}
{ UID: 52478, Value: 999, Rank: 9}