13# ifndef WIN32_LEAN_AND_MEAN
14# define WIN32_LEAN_AND_MEAN
19#elif defined(__linux__)
29#if defined(__EMSCRIPTEN__)
30#undef CSV_ENABLE_THREADS
31#define CSV_ENABLE_THREADS 0
32#elif !defined(CSV_ENABLE_THREADS)
33#define CSV_ENABLE_THREADS 1
37#if defined(__clang__) || defined(__GNUC__)
38 #define CSV_CONST __attribute__((__const__))
39 #define CSV_PURE __attribute__((__pure__))
43 #define CSV_PRIVATE __attribute__((__visibility__("hidden")))
45 #define CSV_NON_NULL(...) __attribute__((__nonnull__(__VA_ARGS__)))
46#elif defined(_MSC_VER)
50 #define CSV_NON_NULL(...)
55 #define CSV_NON_NULL(...)
61# define CSV_MSVC_PUSH_DISABLE(w) __pragma(warning(push)) __pragma(warning(disable: w))
62# define CSV_MSVC_POP __pragma(warning(pop))
64# define CSV_MSVC_PUSH_DISABLE(w)
69#if defined(__cpp_exceptions) || defined(_CPPUNWIND) || defined(__EXCEPTIONS)
70 #define CSV_EXCEPTIONS_ENABLED 1
72 #define CSV_EXCEPTIONS_ENABLED 0
75#if !CSV_EXCEPTIONS_ENABLED
76 #error "csv-parser requires C++ exceptions. Enable exception handling (for example, remove -fno-exceptions or use /EHsc)."
81#if defined(_MSVC_LANG) && _MSVC_LANG > __cplusplus
82# define CSV_CPLUSPLUS _MSVC_LANG
84# define CSV_CPLUSPLUS __cplusplus
87#if CSV_CPLUSPLUS >= 202002L
91#if CSV_CPLUSPLUS >= 201703L
95#if CSV_CPLUSPLUS >= 201402L
101#include <string_view>
103#include "../external/string_view.hpp"
108#pragma region Compatibility Macros
124#define STATIC_ASSERT(x) static_assert(x, "Assertion failed")
139 #define IF_CONSTEXPR if constexpr
140 #define CONSTEXPR_VALUE constexpr
142 #define CONSTEXPR_17 constexpr
144 #define IF_CONSTEXPR if
145 #define CONSTEXPR_VALUE const
147 #define CONSTEXPR_17 inline
151 template<
bool B,
class T =
void>
152 using enable_if_t = std::enable_if_t<B, T>;
154 #define CONSTEXPR_14 constexpr
155 #define CONSTEXPR_VALUE_14 constexpr
157 template<
bool B,
class T =
void>
158 using enable_if_t =
typename std::enable_if<B, T>::type;
160 #define CONSTEXPR_14 inline
161 #define CONSTEXPR_VALUE_14 const
165 template<
typename F,
typename... Args>
166 using invoke_result_t =
typename std::invoke_result<F, Args...>::type;
168 template<
typename F,
typename... Args>
169 using invoke_result_t =
typename std::result_of<F(Args...)>::type;
176#if defined(__GNUC__) && !defined(__clang__)
177 #if defined(CSV_HAS_CXX17) && (((__GNUC__ == 7) && (__GNUC_MINOR__ >= 2)) || (__GNUC__ >= 8))
178 #define CONSTEXPR constexpr
182 #define CONSTEXPR constexpr
187#define CONSTEXPR inline
194 namespace internals {
196#if defined(PAGE_SIZE)
202 inline int getpagesize() {
203 _SYSTEM_INFO sys_info = {};
204 GetSystemInfo(&sys_info);
205 return std::max(sys_info.dwPageSize, sys_info.dwAllocationGranularity);
208 const int PAGE_SIZE = getpagesize();
209#elif defined(__linux__)
210 const int PAGE_SIZE = getpagesize();
238 inline bool is_equal(T a, T b, T epsilon = 0.001) {
240 static_assert(std::is_floating_point<T>::value,
"T must be a floating point type.");
241 return std::abs(a - b) < epsilon;
262 return (
ParseFlags)((int)flag & ~((
int)ParseFlags::QUOTE * quote_escape));
267 STATIC_ASSERT(ParseFlags::DELIMITER < ParseFlags::CARRIAGE_RETURN);
268 STATIC_ASSERT(ParseFlags::DELIMITER < ParseFlags::NEWLINE);
269 STATIC_ASSERT(ParseFlags::CARRIAGE_RETURN < ParseFlags::NEWLINE);
278 STATIC_ASSERT(
quote_escape_flag(ParseFlags::DELIMITER,
false) == ParseFlags::DELIMITER);
279 STATIC_ASSERT(
quote_escape_flag(ParseFlags::CARRIAGE_RETURN,
false) == ParseFlags::CARRIAGE_RETURN);
280 STATIC_ASSERT(
quote_escape_flag(ParseFlags::NEWLINE,
false) == ParseFlags::NEWLINE);
282 STATIC_ASSERT(
quote_escape_flag(ParseFlags::NOT_SPECIAL,
true) == ParseFlags::NOT_SPECIAL);
283 STATIC_ASSERT(
quote_escape_flag(ParseFlags::QUOTE,
true) == ParseFlags::QUOTE_ESCAPE_QUOTE);
284 STATIC_ASSERT(
quote_escape_flag(ParseFlags::DELIMITER,
true) == ParseFlags::NOT_SPECIAL);
285 STATIC_ASSERT(
quote_escape_flag(ParseFlags::CARRIAGE_RETURN,
true) == ParseFlags::NOT_SPECIAL);
286 STATIC_ASSERT(
quote_escape_flag(ParseFlags::NEWLINE,
true) == ParseFlags::NOT_SPECIAL);
299 constexpr unsigned CHAR_OFFSET = std::numeric_limits<char>::is_signed ? 128 : 0;
std::array< ParseFlags, 256 > ParseFlagMap
An array which maps ASCII chars to a parsing flag.
std::array< bool, 256 > WhitespaceMap
An array which maps ASCII chars to a flag indicating if it is whitespace.
bool is_equal(T a, T b, T epsilon=0.001)
const int PAGE_SIZE
Size of a memory page in bytes.
ParseFlags
An enum used for describing the significance of each character with respect to CSV parsing.
@ QUOTE_ESCAPE_QUOTE
A quote inside or terminating a quote_escaped field.
@ NOT_SPECIAL
Characters with no special meaning or escaped delimiters and newlines.
@ NEWLINE
Characters which signify a new row.
@ CARRIAGE_RETURN
Characters which signify a carriage return.
@ QUOTE
Characters which may signify a quote escape.
@ DELIMITER
Characters which signify a new field.
constexpr size_t CSV_CHUNK_SIZE_FLOOR
Minimum supported custom chunk size for CSVFormat::chunk_size().
constexpr ParseFlags quote_escape_flag(ParseFlags flag, bool quote_escape) noexcept
Transform the ParseFlags given the context of whether or not the current field is quote escaped.
constexpr size_t CSV_CHUNK_SIZE_DEFAULT
Default chunk size for lazy-loading large CSV files.
The all encompassing namespace.
constexpr int CSV_NOT_FOUND
Integer indicating a requested column wasn't found.
constexpr unsigned CHAR_OFFSET
Offset to convert char into array index.
nonstd::string_view string_view
The string_view class used by this library.