У меня есть пара pack/unpack
функции, которые оперируют структурой данных.
Чтобы эффективно их тестировать,
Я хотел бы поместить эту структуру в случайное состояние, а затем убедиться, что упаковка и распаковка возвращают исходную структуру. Это может выглядеть примерно так:
for (int i = 0; i < LOTS_OF_TESTS; ++i){
Struct s;
randomize_bits(s);
CHECK ( s == UnPack(Pack(s)) );
}
Есть ли функция, которая принимает универсальный тип и рандомизирует все биты?
условия:
— В структуре нет указателей
— Там могут быть фундаментальные типы
— Там могут быть вложенные структуры
— Там могут быть массивы
— Я не беспокоюсь о набивке
Я думал, что смогу использовать что-то с MemSet,
покупка моя попытка дает мне исключение времени выполнения.
template<typename T>
void randomize_bits(T & t){
for (size_t i = 0; i < sizeof(t); ++i){
std::memset((&t)+i,random_uchar(),1);
}
}
Как предположил Базиль, это решает мою проблему и правильно перебирает память.
template<typename T>
void randomize_bits(T & t){
for (size_t i = 0; i < sizeof(t); ++i){
reinterpret_cast<unsigned char*>(&t)[i] = random_uchar();
}
}
Других решений пока нет …