1#ifndef SIMDJSON_BUILTIN_H
2#define SIMDJSON_BUILTIN_H
3
4#include "simdjson/implementations.h"
5
6// Determine the best builtin implementation
7#ifndef SIMDJSON_BUILTIN_IMPLEMENTATION
8#if SIMDJSON_CAN_ALWAYS_RUN_ICELAKE
9#define SIMDJSON_BUILTIN_IMPLEMENTATION icelake
10#elif SIMDJSON_CAN_ALWAYS_RUN_HASWELL
11#define SIMDJSON_BUILTIN_IMPLEMENTATION haswell
12#elif SIMDJSON_CAN_ALWAYS_RUN_WESTMERE
13#define SIMDJSON_BUILTIN_IMPLEMENTATION westmere
14#elif SIMDJSON_CAN_ALWAYS_RUN_ARM64
15#define SIMDJSON_BUILTIN_IMPLEMENTATION arm64
16#elif SIMDJSON_CAN_ALWAYS_RUN_PPC64
17#define SIMDJSON_BUILTIN_IMPLEMENTATION ppc64
18#elif SIMDJSON_CAN_ALWAYS_RUN_FALLBACK
19#define SIMDJSON_BUILTIN_IMPLEMENTATION fallback
20#else
21#error "All possible implementations (including fallback) have been disabled! simdjson will not run."
22#endif
23#endif // SIMDJSON_BUILTIN_IMPLEMENTATION
24
25#define SIMDJSON_IMPLEMENTATION SIMDJSON_BUILTIN_IMPLEMENTATION
26
27// ondemand is only compiled as part of the builtin implementation at present
28
29// Interface declarations
30#include "simdjson/generic/implementation_simdjson_result_base.h"
31#include "simdjson/generic/ondemand.h"
32
33// Inline definitions
34#include "simdjson/generic/implementation_simdjson_result_base-inl.h"
35#include "simdjson/generic/ondemand-inl.h"
36
37#undef SIMDJSON_IMPLEMENTATION
38
39namespace simdjson {
40 /**
41 * Represents the best statically linked simdjson implementation that can be used by the compiling
42 * program.
43 *
44 * Detects what options the program is compiled against, and picks the minimum implementation that
45 * will work on any computer that can run the program. For example, if you compile with g++
46 * -march=westmere, it will pick the westmere implementation. The haswell implementation will
47 * still be available, and can be selected at runtime, but the builtin implementation (and any
48 * code that uses it) will use westmere.
49 */
50 namespace builtin = SIMDJSON_BUILTIN_IMPLEMENTATION;
51 /**
52 * @copydoc simdjson::SIMDJSON_BUILTIN_IMPLEMENTATION::ondemand
53 */
54 namespace ondemand = SIMDJSON_BUILTIN_IMPLEMENTATION::ondemand;
55 /**
56 * Function which returns a pointer to an implementation matching the "builtin" implementation.
57 * The builtin implementation is the best statically linked simdjson implementation that can be used by the compiling
58 * program. If you compile with g++ -march=haswell, this will return the haswell implementation.
59 * It is handy to be able to check what builtin was used: builtin_implementation()->name().
60 */
61 const implementation * builtin_implementation();
62} // namespace simdjson
63
64#endif // SIMDJSON_BUILTIN_H
65