| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| #include <catch.hpp> |
| #include <algorithm> |
| |
| #include "cpc_compressor.hpp" |
| |
| namespace datasketches { |
| |
| typedef u32_table<std::allocator<void>> table; |
| |
| TEST_CASE("cpc sketch: compress and decompress pairs", "[cpc_sketch]") { |
| const int N = 200; |
| const int MAXWORDS = 1000; |
| |
| HashState twoHashes; |
| uint32_t pairArray[N]; |
| uint32_t pairArray2[N]; |
| uint64_t value = 35538947; // some arbitrary starting value |
| const uint64_t golden64 = 0x9e3779b97f4a7c13ULL; // the golden ratio |
| for (int i = 0; i < N; i++) { |
| MurmurHash3_x64_128(&value, sizeof(value), 0, twoHashes); |
| uint32_t rand = twoHashes.h1 & 0xffff; |
| pairArray[i] = rand; |
| value += golden64; |
| } |
| //table::knuth_shell_sort3(pairArray, 0, N - 1); // unsigned numerical sort |
| std::sort(pairArray, &pairArray[N]); |
| uint32_t prev = UINT32_MAX; |
| int nxt = 0; |
| for (int i = 0; i < N; i++) { // uniquify |
| if (pairArray[i] != prev) { |
| prev = pairArray[i]; |
| pairArray[nxt++] = pairArray[i]; |
| } |
| } |
| int numPairs = nxt; |
| |
| uint32_t compressedWords[MAXWORDS]; |
| |
| for (size_t numBaseBits = 0; numBaseBits <= 11; numBaseBits++) { |
| size_t numWordsWritten = get_compressor<std::allocator<void>>().low_level_compress_pairs(pairArray, numPairs, numBaseBits, compressedWords); |
| get_compressor<std::allocator<void>>().low_level_uncompress_pairs(pairArray2, numPairs, numBaseBits, compressedWords, numWordsWritten); |
| for (int i = 0; i < numPairs; i++) { |
| REQUIRE(pairArray[i] == pairArray2[i]); |
| } |
| } |
| } |
| |
| } /* namespace datasketches */ |