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