Увеличьте multi_index_container с помощью композитного ключа и побитового сравнения

Я хочу добиться чего-то подобного с boost multi_index_container и композитный_ключ:

struct LogicalAnd {
bool operator()(const int& argVal1, const int& argVal2) const {
return int(argVal1 & argVal2) == argVal1;
}
};

template<class T, class Enable = void>
class FooContainer;

template <class T>
struct FooContainer<T,typename boost::enable_if<boost::is_base_of<IFoo, T> >::type> {
typedef multi_index_container<
boost::shared_ptr<T>,
indexed_by<
hashed_non_unique<
composite_key<
T,
const_mem_fun<T,int,&T::getKey1>,
const_mem_fun<T,int,&T::getKey2>
>,
composite_key_equal_to<
LogicalAnd,
LogicalAnd
>
>
>
> shared_ptr_type;
};

[/ NOEDIT] Знаю это:

namespace CustomKey {
typedef enum {
VAL1 = 0x00000001,
VAL2 = 0x00000002,
ALL = 0xFFFFFFFF
} type;
}

[/ NOEDIT] Цель состоит в том, чтобы иметь возможность выполнить следующее:

container.find(boost::make_tuple(CustomKey::VAL1, CustomKey::ALL));

[/ NOEDIT]

Что позволило бы мне получить все элементы, для которых LogicalAnd возвращает true.

Проблема в том, что мне не удается заставить мой LogicalAnd компаратор работать с моим multi_index_container.

Я могу получить его для сборки, добавив Composite_key_hash прямо перед Composit_key_equal_to:

composite_key_hash<
boost::hash<int>,
boost::hash<int>
>

[/ NOEDIT] Но находить операция не работает, как ожидалось, поэтому она не сильно меняется …

Я искал документацию для надстройки, и я пробовал различные реализации, но я тону в объеме информации …

Любая помощь приветствуется!

1

Решение

Вы используете гашиш для вашего мультииндекса.

Это означает, что LogicalAnd Компаратор никогда не вызывается, если что-то не найдено в правильном контейнере хеша.

0x01 а также 0xFF не хэшируйте к тому же значению даже если 0x01 & 0xFF == 0x01, То есть, LogicalAnd вернул бы true, но это никогда не вызывается.

Вам нужна хеш-функция, которая является инвариантной по отношению к. LogicalAndи я не думаю, что это возможно. Предполагается, что большинство хеш-функций сводят к минимуму коллизии между различными значениями ключа.

Боюсь, вам нужно придумать другую систему индексации.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector