1e462795ff5d4c7359f9e8637c10544bb2de70107tturney// Tencent is pleased to support the open source community by making RapidJSON available.
2e462795ff5d4c7359f9e8637c10544bb2de70107tturney//
3e462795ff5d4c7359f9e8637c10544bb2de70107tturney// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
4e462795ff5d4c7359f9e8637c10544bb2de70107tturney//
5e462795ff5d4c7359f9e8637c10544bb2de70107tturney// Licensed under the MIT License (the "License"); you may not use this file except
6e462795ff5d4c7359f9e8637c10544bb2de70107tturney// in compliance with the License. You may obtain a copy of the License at
7e462795ff5d4c7359f9e8637c10544bb2de70107tturney//
8e462795ff5d4c7359f9e8637c10544bb2de70107tturney// http://opensource.org/licenses/MIT
9e462795ff5d4c7359f9e8637c10544bb2de70107tturney//
10e462795ff5d4c7359f9e8637c10544bb2de70107tturney// Unless required by applicable law or agreed to in writing, software distributed
11e462795ff5d4c7359f9e8637c10544bb2de70107tturney// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
12e462795ff5d4c7359f9e8637c10544bb2de70107tturney// CONDITIONS OF ANY KIND, either express or implied. See the License for the
13e462795ff5d4c7359f9e8637c10544bb2de70107tturney// specific language governing permissions and limitations under the License.
14e462795ff5d4c7359f9e8637c10544bb2de70107tturney
15e462795ff5d4c7359f9e8637c10544bb2de70107tturney// Since Travis CI installs old Valgrind 3.7.0, which fails with some SSE4.2
16e462795ff5d4c7359f9e8637c10544bb2de70107tturney// The unit tests prefix with SIMD should be skipped by Valgrind test
17e462795ff5d4c7359f9e8637c10544bb2de70107tturney
18e462795ff5d4c7359f9e8637c10544bb2de70107tturney// __SSE2__ and __SSE4_2__ are recognized by gcc, clang, and the Intel compiler.
19e462795ff5d4c7359f9e8637c10544bb2de70107tturney// We use -march=native with gmake to enable -msse2 and -msse4.2, if supported.
20e462795ff5d4c7359f9e8637c10544bb2de70107tturney#if defined(__SSE4_2__)
21e462795ff5d4c7359f9e8637c10544bb2de70107tturney#  define RAPIDJSON_SSE42
22e462795ff5d4c7359f9e8637c10544bb2de70107tturney#elif defined(__SSE2__)
23e462795ff5d4c7359f9e8637c10544bb2de70107tturney#  define RAPIDJSON_SSE2
24e462795ff5d4c7359f9e8637c10544bb2de70107tturney#endif
25e462795ff5d4c7359f9e8637c10544bb2de70107tturney
26e462795ff5d4c7359f9e8637c10544bb2de70107tturney#define RAPIDJSON_NAMESPACE rapidjson_simd
27e462795ff5d4c7359f9e8637c10544bb2de70107tturney
28e462795ff5d4c7359f9e8637c10544bb2de70107tturney#include "unittest.h"
29e462795ff5d4c7359f9e8637c10544bb2de70107tturney
30e462795ff5d4c7359f9e8637c10544bb2de70107tturney#include "rapidjson/reader.h"
31e462795ff5d4c7359f9e8637c10544bb2de70107tturney
32e462795ff5d4c7359f9e8637c10544bb2de70107tturneyusing namespace rapidjson_simd;
33e462795ff5d4c7359f9e8637c10544bb2de70107tturney
34e462795ff5d4c7359f9e8637c10544bb2de70107tturney#ifdef RAPIDJSON_SSE2
35e462795ff5d4c7359f9e8637c10544bb2de70107tturney#define SIMD_SUFFIX(name) name##_SSE2
36e462795ff5d4c7359f9e8637c10544bb2de70107tturney#elif defined(RAPIDJSON_SSE42)
37e462795ff5d4c7359f9e8637c10544bb2de70107tturney#define SIMD_SUFFIX(name) name##_SSE42
38e462795ff5d4c7359f9e8637c10544bb2de70107tturney#else
39e462795ff5d4c7359f9e8637c10544bb2de70107tturney#define SIMD_SUFFIX(name) name
40e462795ff5d4c7359f9e8637c10544bb2de70107tturney#endif
41e462795ff5d4c7359f9e8637c10544bb2de70107tturney
42e462795ff5d4c7359f9e8637c10544bb2de70107tturneytemplate <typename StreamType>
43e462795ff5d4c7359f9e8637c10544bb2de70107tturneyvoid TestSkipWhitespace() {
44e462795ff5d4c7359f9e8637c10544bb2de70107tturney    for (int step = 1; step < 32; step++) {
45e462795ff5d4c7359f9e8637c10544bb2de70107tturney        char buffer[1025];
46e462795ff5d4c7359f9e8637c10544bb2de70107tturney        for (size_t i = 0; i < 1024; i++)
47e462795ff5d4c7359f9e8637c10544bb2de70107tturney            buffer[i] = " \t\r\n"[i % 4];
48e462795ff5d4c7359f9e8637c10544bb2de70107tturney        for (size_t i = 0; i < 1024; i += step)
49e462795ff5d4c7359f9e8637c10544bb2de70107tturney            buffer[i] = 'X';
50e462795ff5d4c7359f9e8637c10544bb2de70107tturney        buffer[1024] = '\0';
51e462795ff5d4c7359f9e8637c10544bb2de70107tturney
52e462795ff5d4c7359f9e8637c10544bb2de70107tturney        StreamType s(buffer);
53e462795ff5d4c7359f9e8637c10544bb2de70107tturney        size_t i = 0;
54e462795ff5d4c7359f9e8637c10544bb2de70107tturney        for (;;) {
55e462795ff5d4c7359f9e8637c10544bb2de70107tturney            SkipWhitespace(s);
56e462795ff5d4c7359f9e8637c10544bb2de70107tturney            if (s.Peek() == '\0')
57e462795ff5d4c7359f9e8637c10544bb2de70107tturney                break;
58e462795ff5d4c7359f9e8637c10544bb2de70107tturney            EXPECT_EQ(i, s.Tell());
59e462795ff5d4c7359f9e8637c10544bb2de70107tturney            EXPECT_EQ('X', s.Take());
60e462795ff5d4c7359f9e8637c10544bb2de70107tturney            i += step;
61e462795ff5d4c7359f9e8637c10544bb2de70107tturney        }
62e462795ff5d4c7359f9e8637c10544bb2de70107tturney    }
63e462795ff5d4c7359f9e8637c10544bb2de70107tturney}
64e462795ff5d4c7359f9e8637c10544bb2de70107tturney
65e462795ff5d4c7359f9e8637c10544bb2de70107tturneyTEST(SIMD, SIMD_SUFFIX(SkipWhitespace)) {
66e462795ff5d4c7359f9e8637c10544bb2de70107tturney    TestSkipWhitespace<StringStream>();
67e462795ff5d4c7359f9e8637c10544bb2de70107tturney    TestSkipWhitespace<InsituStringStream>();
68e462795ff5d4c7359f9e8637c10544bb2de70107tturney}
69