Vince's CSV Parser
Loading...
Searching...
No Matches
common.hpp File Reference

A standalone header file containing shared code. More...

#include <algorithm>
#include <array>
#include <cmath>
#include <cstdlib>
#include <deque>
#include <type_traits>
#include "../external/string_view.hpp"

Go to the source code of this file.

Namespaces

namespace  csv
 The all encompassing namespace.
 

Macros

#define CSV_INLINE
 Helper macro which should be #defined as "inline" in the single header version.
 
#define CSV_ENABLE_THREADS   1
 
#define CSV_CONST
 
#define CSV_PURE
 
#define CSV_PRIVATE
 
#define CSV_NON_NULL(...)
 
#define CSV_MSVC_PUSH_DISABLE(w)
 
#define CSV_MSVC_POP
 
#define CSV_EXCEPTIONS_ENABLED   0
 
#define CSV_CPLUSPLUS   __cplusplus
 
#define STATIC_ASSERT(x)   static_assert(x, "Assertion failed")
 
#define IF_CONSTEXPR   if
 Expands to if constexpr in C++17 and if otherwise.
 
#define CONSTEXPR_VALUE   const
 Expands to constexpr in C++17 and const otherwise.
 
#define CONSTEXPR_17   inline
 
#define CONSTEXPR_14   inline
 
#define CONSTEXPR_VALUE_14   const
 
#define CONSTEXPR   inline
 Expands to constexpr in decent compilers and inline otherwise.
 

Typedefs

using csv::string_view = nonstd::string_view
 The string_view class used by this library.
 
template<bool B, class T = void>
using csv::enable_if_t = typename std::enable_if< B, T >::type
 
template<typename F , typename... Args>
using csv::invoke_result_t = typename std::result_of< F(Args...)>::type
 
using csv::internals::ParseFlagMap = std::array< ParseFlags, 256 >
 An array which maps ASCII chars to a parsing flag.
 
using csv::internals::WhitespaceMap = std::array< bool, 256 >
 An array which maps ASCII chars to a flag indicating if it is whitespace.
 

Enumerations

enum class  csv::internals::ParseFlags {
  QUOTE_ESCAPE_QUOTE = 0 , QUOTE = 2 | 1 , NOT_SPECIAL = 4 , DELIMITER = 4 | 1 ,
  CARRIAGE_RETURN = 4 | 2 , NEWLINE = 4 | 2 | 1
}
 An enum used for describing the significance of each character with respect to CSV parsing. More...
 

Functions

template<typename T >
bool csv::internals::is_equal (T a, T b, T epsilon=0.001)
 
constexpr ParseFlags csv::internals::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.
 
 csv::internals::STATIC_ASSERT (ParseFlags::DELIMITER< ParseFlags::CARRIAGE_RETURN)
 
 csv::internals::STATIC_ASSERT (quote_escape_flag(ParseFlags::NOT_SPECIAL, false)==ParseFlags::NOT_SPECIAL)
 Optimizations for reducing branching in parsing loop.
 
 csv::internals::STATIC_ASSERT (quote_escape_flag(ParseFlags::QUOTE, false)==ParseFlags::QUOTE)
 
 csv::internals::STATIC_ASSERT (quote_escape_flag(ParseFlags::DELIMITER, false)==ParseFlags::DELIMITER)
 
 csv::internals::STATIC_ASSERT (quote_escape_flag(ParseFlags::CARRIAGE_RETURN, false)==ParseFlags::CARRIAGE_RETURN)
 
 csv::internals::STATIC_ASSERT (quote_escape_flag(ParseFlags::NEWLINE, false)==ParseFlags::NEWLINE)
 
 csv::internals::STATIC_ASSERT (quote_escape_flag(ParseFlags::NOT_SPECIAL, true)==ParseFlags::NOT_SPECIAL)
 
 csv::internals::STATIC_ASSERT (quote_escape_flag(ParseFlags::QUOTE, true)==ParseFlags::QUOTE_ESCAPE_QUOTE)
 
 csv::internals::STATIC_ASSERT (quote_escape_flag(ParseFlags::DELIMITER, true)==ParseFlags::NOT_SPECIAL)
 
 csv::internals::STATIC_ASSERT (quote_escape_flag(ParseFlags::CARRIAGE_RETURN, true)==ParseFlags::NOT_SPECIAL)
 
 csv::internals::STATIC_ASSERT (quote_escape_flag(ParseFlags::NEWLINE, true)==ParseFlags::NOT_SPECIAL)
 

Variables

const int csv::internals::PAGE_SIZE = 4096
 Size of a memory page in bytes.
 
constexpr size_t csv::internals::CSV_CHUNK_SIZE_DEFAULT = 10000000
 Default chunk size for lazy-loading large CSV files.
 
constexpr size_t csv::internals::CSV_CHUNK_SIZE_FLOOR = 500 * 1024
 Minimum supported custom chunk size for CSVFormat::chunk_size().
 
constexpr int csv::CSV_NOT_FOUND = -1
 Integer indicating a requested column wasn't found.
 
constexpr unsigned csv::CHAR_OFFSET = std::numeric_limits<char>::is_signed ? 128 : 0
 Offset to convert char into array index.
 

Detailed Description

A standalone header file containing shared code.

Definition in file common.hpp.

Macro Definition Documentation

◆ CONSTEXPR

#define CONSTEXPR   inline

Expands to constexpr in decent compilers and inline otherwise.

Intended for functions and methods.

Definition at line 187 of file common.hpp.

◆ CONSTEXPR_14

#define CONSTEXPR_14   inline

Definition at line 160 of file common.hpp.

◆ CONSTEXPR_17

#define CONSTEXPR_17   inline

Definition at line 147 of file common.hpp.

◆ CONSTEXPR_VALUE

#define CONSTEXPR_VALUE   const

Expands to constexpr in C++17 and const otherwise.

Mainly used for global variables.

Definition at line 145 of file common.hpp.

◆ CONSTEXPR_VALUE_14

#define CONSTEXPR_VALUE_14   const

Definition at line 161 of file common.hpp.

◆ CSV_CONST

#define CSV_CONST

Definition at line 52 of file common.hpp.

◆ CSV_CPLUSPLUS

#define CSV_CPLUSPLUS   __cplusplus

Definition at line 84 of file common.hpp.

◆ CSV_ENABLE_THREADS

#define CSV_ENABLE_THREADS   1

Definition at line 33 of file common.hpp.

◆ CSV_EXCEPTIONS_ENABLED

#define CSV_EXCEPTIONS_ENABLED   0

Definition at line 72 of file common.hpp.

◆ CSV_INLINE

#define CSV_INLINE

Helper macro which should be #defined as "inline" in the single header version.

Definition at line 26 of file common.hpp.

◆ CSV_MSVC_POP

#define CSV_MSVC_POP

Definition at line 65 of file common.hpp.

◆ CSV_MSVC_PUSH_DISABLE

#define CSV_MSVC_PUSH_DISABLE (   w)

Definition at line 64 of file common.hpp.

◆ CSV_NON_NULL

#define CSV_NON_NULL (   ...)

Definition at line 55 of file common.hpp.

◆ CSV_PRIVATE

#define CSV_PRIVATE

Definition at line 54 of file common.hpp.

◆ CSV_PURE

#define CSV_PURE

Definition at line 53 of file common.hpp.

◆ IF_CONSTEXPR

#define IF_CONSTEXPR   if

Expands to if constexpr in C++17 and if otherwise.

Definition at line 144 of file common.hpp.

◆ STATIC_ASSERT

#define STATIC_ASSERT (   x)    static_assert(x, "Assertion failed")

Definition at line 124 of file common.hpp.

Typedef Documentation

◆ ParseFlagMap

using csv::internals::ParseFlagMap = typedef std::array<ParseFlags, 256>

An array which maps ASCII chars to a parsing flag.

Definition at line 289 of file common.hpp.

◆ WhitespaceMap

using csv::internals::WhitespaceMap = typedef std::array<bool, 256>

An array which maps ASCII chars to a flag indicating if it is whitespace.

Definition at line 292 of file common.hpp.

Enumeration Type Documentation

◆ ParseFlags

enum class csv::internals::ParseFlags
strong

An enum used for describing the significance of each character with respect to CSV parsing.

See also
quote_escape_flag
Enumerator
QUOTE_ESCAPE_QUOTE 

A quote inside or terminating a quote_escaped field.

QUOTE 

Characters which may signify a quote escape.

NOT_SPECIAL 

Characters with no special meaning or escaped delimiters and newlines.

DELIMITER 

Characters which signify a new field.

CARRIAGE_RETURN 

Characters which signify a carriage return.

NEWLINE 

Characters which signify a new row.

Definition at line 250 of file common.hpp.

Function Documentation

◆ is_equal()

template<typename T >
bool csv::internals::is_equal ( T  a,
T  b,
T  epsilon = 0.001 
)
inline

Returns true if two floating point values are about the same

Definition at line 238 of file common.hpp.

◆ quote_escape_flag()

constexpr ParseFlags csv::internals::quote_escape_flag ( ParseFlags  flag,
bool  quote_escape 
)
constexprnoexcept

Transform the ParseFlags given the context of whether or not the current field is quote escaped.

Definition at line 261 of file common.hpp.

◆ STATIC_ASSERT()

Optimizations for reducing branching in parsing loop.

Idea: The meaning of all non-quote characters changes depending on whether or not the parser is in a quote-escaped mode (0 or 1)

Variable Documentation

◆ CSV_CHUNK_SIZE_DEFAULT

constexpr size_t csv::internals::CSV_CHUNK_SIZE_DEFAULT = 10000000
constexpr

Default chunk size for lazy-loading large CSV files.

The worker thread reads this many bytes at a time by default (10MB).

CRITICAL INVARIANT: Field boundaries at chunk transitions must be preserved. Bug #280 was caused by fields spanning chunk boundaries being corrupted.

Note
Tests must write >10MB of data to cross chunk boundaries
See also
basic_csv_parser.cpp MmapParser::next() for chunk transition logic

Definition at line 228 of file common.hpp.

◆ CSV_CHUNK_SIZE_FLOOR

constexpr size_t csv::internals::CSV_CHUNK_SIZE_FLOOR = 500 * 1024
constexpr

Minimum supported custom chunk size for CSVFormat::chunk_size().

This lower bound allows memory-constrained environments to reduce parser buffer size while avoiding pathological tiny-buffer overhead.

Definition at line 235 of file common.hpp.

◆ PAGE_SIZE

const int csv::internals::PAGE_SIZE = 4096

Size of a memory page in bytes.

Used by csv::internals::CSVFieldArray when allocating blocks.

Definition at line 215 of file common.hpp.