tcuSeedBuilder.cpp revision f0baefc76087f208e58af77dccaecdbac73e1247
1/*------------------------------------------------------------------------- 2 * drawElements Quality Program Tester Core 3 * ---------------------------------------- 4 * 5 * Copyright 2014 The Android Open Source Project 6 * 7 * Licensed under the Apache License, Version 2.0 (the "License"); 8 * you may not use this file except in compliance with the License. 9 * You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, software 14 * distributed under the License is distributed on an "AS IS" BASIS, 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 * See the License for the specific language governing permissions and 17 * limitations under the License. 18 * 19 *//*! 20 * \file 21 * \brief Utility class to build seeds from different data types. 22 * 23 * Values are first XORed with type specifig mask, which makes sure that 24 * two values with different types, but same bit presentation produce 25 * different results. Then values are passed through 32 bit crc. 26 *//*--------------------------------------------------------------------*/ 27 28#include "tcuSeedBuilder.hpp" 29 30namespace tcu 31{ 32 33namespace 34{ 35 36deUint32 advanceCrc32 (deUint32 oldCrc, size_t len, const deUint8* data) 37{ 38 const deUint32 generator = 0x04C11DB7u; 39 deUint32 crc = oldCrc; 40 41 for (size_t i = 0; i < len; i++) 42 { 43 const deUint32 current = static_cast<deUint32>(data[i]); 44 crc = crc ^ current; 45 46 for (size_t bitNdx = 0; bitNdx < 8; bitNdx++) 47 { 48 if (crc & 1u) 49 crc = (crc >> 1u) ^ generator; 50 else 51 crc = (crc >> 1u); 52 } 53 } 54 55 return crc; 56} 57 58} // anonymous 59 60SeedBuilder::SeedBuilder (void) 61 : m_hash (0xccf139d7u) 62{ 63} 64 65void SeedBuilder::feed (size_t size, const void* ptr) 66{ 67 m_hash = advanceCrc32(m_hash, size, (const deUint8*)ptr); 68} 69 70SeedBuilder& operator<< (SeedBuilder& builder, bool value) 71{ 72 const deUint8 val = (value ? 54: 7); 73 74 builder.feed(sizeof(val), &val); 75 return builder; 76} 77 78SeedBuilder& operator<< (SeedBuilder& builder, deInt8 value) 79{ 80 const deInt8 val = value ^ 75; 81 82 builder.feed(sizeof(val), &val); 83 return builder; 84} 85 86SeedBuilder& operator<< (SeedBuilder& builder, deUint8 value) 87{ 88 const deInt8 val = value ^ 140u; 89 90 builder.feed(sizeof(val), &val); 91 return builder; 92} 93 94SeedBuilder& operator<< (SeedBuilder& builder, deInt16 value) 95{ 96 const deInt16 val = value ^ 555; 97 98 builder.feed(sizeof(val), &val); 99 return builder; 100} 101 102SeedBuilder& operator<< (SeedBuilder& builder, deUint16 value) 103{ 104 const deUint16 val = value ^ 37323u; 105 106 builder.feed(sizeof(val), &val); 107 return builder; 108} 109 110SeedBuilder& operator<< (SeedBuilder& builder, deInt32 value) 111{ 112 const deInt32 val = value ^ 53054741; 113 114 builder.feed(sizeof(val), &val); 115 return builder; 116} 117 118SeedBuilder& operator<< (SeedBuilder& builder, deUint32 value) 119{ 120 const deUint32 val = value ^ 1977303630u; 121 122 builder.feed(sizeof(val), &val); 123 return builder; 124} 125 126SeedBuilder& operator<< (SeedBuilder& builder, deInt64 value) 127{ 128 const deInt64 val = value ^ 772935234179004386ll; 129 130 builder.feed(sizeof(val), &val); 131 return builder; 132} 133 134SeedBuilder& operator<< (SeedBuilder& builder, deUint64 value) 135{ 136 const deUint64 val = value ^ 4664937258000467599ull; 137 138 builder.feed(sizeof(val), &val); 139 return builder; 140} 141 142SeedBuilder& operator<< (SeedBuilder& builder, float value) 143{ 144 builder.feed(sizeof(value), &value); 145 return builder; 146} 147 148SeedBuilder& operator<< (SeedBuilder& builder, double value) 149{ 150 builder.feed(sizeof(value), &value); 151 return builder; 152} 153 154SeedBuilder& operator<< (SeedBuilder& builder, const std::string& value) 155{ 156 builder.feed(value.length(), value.c_str()); 157 return builder; 158} 159 160} // tcu 161