fixed issues with dllexport + extern templates

This commit is contained in:
Mark Gillard 2021-10-27 19:48:45 +03:00
parent 18dfcf2314
commit 467ade4efc
14 changed files with 437 additions and 448 deletions

View File

@ -158,6 +158,7 @@ StatementMacros:
- TOML_ATTR
- TOML_CONST_GETTER
- TOML_CONST_INLINE_GETTER
- TOML_EXTERN
- TOML_EXTERNAL_LINKAGE
- TOML_INTERNAL_LINKAGE
- TOML_MEMBER_ATTR

View File

@ -10,6 +10,7 @@
#define TOML_CONST_INLINE_GETTER inline
#define TOML_CONSTRAINED_TEMPLATE(cond, ...) template <__VA_ARGS__>
#define TOML_EMPTY_BASES
#define TOML_EXTERN
#define TOML_EXTERN_NOEXCEPT(...)
#define TOML_EXTERNAL_LINKAGE
#define TOML_IMPL_NAMESPACE_END static_assert(true)

View File

@ -741,64 +741,17 @@ TOML_NAMESPACE_START
template <typename T>
node_view(T*) -> node_view<node>;
#if TOML_EXTERN_TEMPLATES
/// \endcond
}
TOML_NAMESPACE_END;
extern template class TOML_API node_view<node>;
extern template class TOML_API node_view<const node>;
#define TOML_EXTERN(name, T) \
extern template TOML_API \
optional<T> node_view<node>::name<T>() const TOML_EXTERN_NOEXCEPT(impl::value_retrieval_is_nothrow<T>); \
extern template TOML_API \
optional<T> node_view<const node>::name<T>() const TOML_EXTERN_NOEXCEPT(impl::value_retrieval_is_nothrow<T>)
TOML_EXTERN(value_exact, std::string_view);
TOML_EXTERN(value_exact, std::string);
TOML_EXTERN(value_exact, const char*);
TOML_EXTERN(value_exact, int64_t);
TOML_EXTERN(value_exact, double);
TOML_EXTERN(value_exact, date);
TOML_EXTERN(value_exact, time);
TOML_EXTERN(value_exact, date_time);
TOML_EXTERN(value_exact, bool);
TOML_EXTERN(value, std::string_view);
TOML_EXTERN(value, std::string);
TOML_EXTERN(value, const char*);
TOML_EXTERN(value, signed char);
TOML_EXTERN(value, signed short);
TOML_EXTERN(value, signed int);
TOML_EXTERN(value, signed long);
TOML_EXTERN(value, signed long long);
TOML_EXTERN(value, unsigned char);
TOML_EXTERN(value, unsigned short);
TOML_EXTERN(value, unsigned int);
TOML_EXTERN(value, unsigned long);
TOML_EXTERN(value, unsigned long long);
TOML_EXTERN(value, double);
TOML_EXTERN(value, float);
TOML_EXTERN(value, date);
TOML_EXTERN(value, time);
TOML_EXTERN(value, date_time);
TOML_EXTERN(value, bool);
#if TOML_HAS_CHAR8
TOML_EXTERN(value_exact, std::u8string_view);
TOML_EXTERN(value_exact, std::u8string);
TOML_EXTERN(value_exact, const char8_t*);
TOML_EXTERN(value, std::u8string_view);
TOML_EXTERN(value, std::u8string);
TOML_EXTERN(value, const char8_t*);
/// \cond
#if (TOML_EXTERN_TEMPLATES && !TOML_IMPLEMENTATION) || TOML_INTELLISENSE
#include "node_view_extern.inl"
#endif
#if TOML_WINDOWS_COMPAT
TOML_EXTERN(value_exact, std::wstring);
TOML_EXTERN(value, std::wstring);
#endif
#undef TOML_EXTERN
#endif // TOML_EXTERN_TEMPLATES
TOML_NAMESPACE_START
{
inline node::operator node_view<node>() noexcept
{
return node_view<node>(this);
@ -808,9 +761,8 @@ TOML_NAMESPACE_START
{
return node_view<const node>(this);
}
/// \endcond
}
TOML_NAMESPACE_END;
/// \endcond
#include "header_end.h"

View File

@ -11,67 +11,11 @@
#endif
//# }}
#if TOML_EXTERN_TEMPLATES
#include "node_view.h"
#include "date_time.h"
#include "header_start.h"
TOML_NAMESPACE_START
{
template class node_view<node>;
template class node_view<const node>;
#define TOML_EXTERN(name, T) \
template optional<T> node_view<node>::name<T>() const TOML_EXTERN_NOEXCEPT(impl::value_retrieval_is_nothrow<T>); \
template optional<T> node_view<const node>::name<T>() \
const TOML_EXTERN_NOEXCEPT(impl::value_retrieval_is_nothrow<T>)
TOML_EXTERN(value_exact, std::string_view);
TOML_EXTERN(value_exact, std::string);
TOML_EXTERN(value_exact, const char*);
TOML_EXTERN(value_exact, int64_t);
TOML_EXTERN(value_exact, double);
TOML_EXTERN(value_exact, date);
TOML_EXTERN(value_exact, time);
TOML_EXTERN(value_exact, date_time);
TOML_EXTERN(value_exact, bool);
TOML_EXTERN(value, std::string_view);
TOML_EXTERN(value, std::string);
TOML_EXTERN(value, const char*);
TOML_EXTERN(value, signed char);
TOML_EXTERN(value, signed short);
TOML_EXTERN(value, signed int);
TOML_EXTERN(value, signed long);
TOML_EXTERN(value, signed long long);
TOML_EXTERN(value, unsigned char);
TOML_EXTERN(value, unsigned short);
TOML_EXTERN(value, unsigned int);
TOML_EXTERN(value, unsigned long);
TOML_EXTERN(value, unsigned long long);
TOML_EXTERN(value, double);
TOML_EXTERN(value, float);
TOML_EXTERN(value, date);
TOML_EXTERN(value, time);
TOML_EXTERN(value, date_time);
TOML_EXTERN(value, bool);
#if TOML_HAS_CHAR8
TOML_EXTERN(value_exact, std::u8string_view);
TOML_EXTERN(value_exact, std::u8string);
TOML_EXTERN(value_exact, const char8_t*);
TOML_EXTERN(value, std::u8string_view);
TOML_EXTERN(value, std::u8string);
TOML_EXTERN(value, const char8_t*);
#endif
#if TOML_WINDOWS_COMPAT
TOML_EXTERN(value_exact, std::wstring);
TOML_EXTERN(value, std::wstring);
#endif
#undef TOML_EXTERN
}
TOML_NAMESPACE_END;
#if (TOML_EXTERN_TEMPLATES && TOML_IMPLEMENTATION) || TOML_INTELLISENSE
#include "node_view_extern.inl"
#endif // TOML_EXTERN_TEMPLATES
#include "header_end.h"
#endif // TOML_EXTERN_TEMPLATES

View File

@ -0,0 +1,72 @@
//# This file is a part of toml++ and is subject to the the terms of the MIT license.
//# Copyright (c) Mark Gillard <mark.gillard@outlook.com.au>
//# See https://github.com/marzer/tomlplusplus/blob/master/LICENSE for the full license text.
// SPDX-License-Identifier: MIT
#pragma once
/// \cond
#include "node_view.h"
TOML_NAMESPACE_START
{
TOML_EXTERN
template class TOML_API node_view<node>;
TOML_EXTERN
template class TOML_API node_view<const node>;
#define TOML_EXTERN_FUNC(name, T) \
TOML_EXTERN \
template TOML_API \
optional<T> node_view<node>::name<T>() const TOML_EXTERN_NOEXCEPT(impl::value_retrieval_is_nothrow<T>); \
TOML_EXTERN \
template TOML_API \
optional<T> node_view<const node>::name<T>() const TOML_EXTERN_NOEXCEPT(impl::value_retrieval_is_nothrow<T>)
TOML_EXTERN_FUNC(value_exact, std::string_view);
TOML_EXTERN_FUNC(value_exact, std::string);
TOML_EXTERN_FUNC(value_exact, const char*);
TOML_EXTERN_FUNC(value_exact, int64_t);
TOML_EXTERN_FUNC(value_exact, double);
TOML_EXTERN_FUNC(value_exact, date);
TOML_EXTERN_FUNC(value_exact, time);
TOML_EXTERN_FUNC(value_exact, date_time);
TOML_EXTERN_FUNC(value_exact, bool);
TOML_EXTERN_FUNC(value, std::string_view);
TOML_EXTERN_FUNC(value, std::string);
TOML_EXTERN_FUNC(value, const char*);
TOML_EXTERN_FUNC(value, signed char);
TOML_EXTERN_FUNC(value, signed short);
TOML_EXTERN_FUNC(value, signed int);
TOML_EXTERN_FUNC(value, signed long);
TOML_EXTERN_FUNC(value, signed long long);
TOML_EXTERN_FUNC(value, unsigned char);
TOML_EXTERN_FUNC(value, unsigned short);
TOML_EXTERN_FUNC(value, unsigned int);
TOML_EXTERN_FUNC(value, unsigned long);
TOML_EXTERN_FUNC(value, unsigned long long);
TOML_EXTERN_FUNC(value, double);
TOML_EXTERN_FUNC(value, float);
TOML_EXTERN_FUNC(value, date);
TOML_EXTERN_FUNC(value, time);
TOML_EXTERN_FUNC(value, date_time);
TOML_EXTERN_FUNC(value, bool);
#if TOML_HAS_CHAR8
TOML_EXTERN_FUNC(value_exact, std::u8string_view);
TOML_EXTERN_FUNC(value_exact, std::u8string);
TOML_EXTERN_FUNC(value_exact, const char8_t*);
TOML_EXTERN_FUNC(value, std::u8string_view);
TOML_EXTERN_FUNC(value, std::u8string);
TOML_EXTERN_FUNC(value, const char8_t*);
#endif
#if TOML_WINDOWS_COMPAT
TOML_EXTERN_FUNC(value_exact, std::wstring);
TOML_EXTERN_FUNC(value, std::wstring);
#endif
#undef TOML_EXTERN_FUNC
}
TOML_NAMESPACE_END;
/// \endcond

View File

@ -351,7 +351,7 @@
#ifndef TOML_EXTERN_TEMPLATES
#define TOML_EXTERN_TEMPLATES 1
#endif
#if (defined(DOXYGEN) || TOML_HEADER_ONLY) && !TOML_INTELLISENSE
#if (defined(DOXYGEN) || TOML_HEADER_ONLY)
#undef TOML_EXTERN_TEMPLATES
#define TOML_EXTERN_TEMPLATES 0
#endif
@ -651,6 +651,11 @@
#define POXY_IMPLEMENTATION_DETAIL(...) __VA_ARGS__
#endif
#if TOML_IMPLEMENTATION
#define TOML_EXTERN
#else
#define TOML_EXTERN extern
#endif
#if TOML_CLANG
#define TOML_EXTERN_NOEXCEPT(...)
#else

View File

@ -4,6 +4,7 @@
// SPDX-License-Identifier: MIT
#pragma once
#include "date_time.h"
#include "node.h"
#include "print_to_stream.h"
#include "header_start.h"
@ -1099,69 +1100,14 @@ TOML_NAMESPACE_START
}
}
#if TOML_EXTERN_TEMPLATES
extern template class TOML_API value<std::string>;
extern template class TOML_API value<int64_t>;
extern template class TOML_API value<double>;
extern template class TOML_API value<bool>;
extern template class TOML_API value<date>;
extern template class TOML_API value<time>;
extern template class TOML_API value<date_time>;
#define TOML_EXTERN(name, T) \
extern template TOML_API \
optional<T> node::name<T>() const TOML_EXTERN_NOEXCEPT(impl::value_retrieval_is_nothrow<T>)
TOML_EXTERN(value_exact, std::string_view);
TOML_EXTERN(value_exact, std::string);
TOML_EXTERN(value_exact, const char*);
TOML_EXTERN(value_exact, int64_t);
TOML_EXTERN(value_exact, double);
TOML_EXTERN(value_exact, date);
TOML_EXTERN(value_exact, time);
TOML_EXTERN(value_exact, date_time);
TOML_EXTERN(value_exact, bool);
TOML_EXTERN(value, std::string_view);
TOML_EXTERN(value, std::string);
TOML_EXTERN(value, const char*);
TOML_EXTERN(value, signed char);
TOML_EXTERN(value, signed short);
TOML_EXTERN(value, signed int);
TOML_EXTERN(value, signed long);
TOML_EXTERN(value, signed long long);
TOML_EXTERN(value, unsigned char);
TOML_EXTERN(value, unsigned short);
TOML_EXTERN(value, unsigned int);
TOML_EXTERN(value, unsigned long);
TOML_EXTERN(value, unsigned long long);
TOML_EXTERN(value, double);
TOML_EXTERN(value, float);
TOML_EXTERN(value, date);
TOML_EXTERN(value, time);
TOML_EXTERN(value, date_time);
TOML_EXTERN(value, bool);
#if TOML_HAS_CHAR8
TOML_EXTERN(value_exact, std::u8string_view);
TOML_EXTERN(value_exact, std::u8string);
TOML_EXTERN(value_exact, const char8_t*);
TOML_EXTERN(value, std::u8string_view);
TOML_EXTERN(value, std::u8string);
TOML_EXTERN(value, const char8_t*);
#endif
#if TOML_WINDOWS_COMPAT
TOML_EXTERN(value_exact, std::wstring);
TOML_EXTERN(value, std::wstring);
#endif
#undef TOML_EXTERN
#endif // TOML_EXTERN_TEMPLATES
/// \endcond
}
TOML_NAMESPACE_END;
/// \cond
#if (TOML_EXTERN_TEMPLATES && !TOML_IMPLEMENTATION) || TOML_INTELLISENSE
#include "value_extern.inl"
#endif
/// \endcond
#include "header_end.h"

View File

@ -11,70 +11,11 @@
#endif
//# }}
#if TOML_EXTERN_TEMPLATES
#include "value.h"
#include "date_time.h"
#include "header_start.h"
TOML_NAMESPACE_START
{
template class value<std::string>;
template class value<int64_t>;
template class value<double>;
template class value<bool>;
template class value<date>;
template class value<time>;
template class value<date_time>;
#define TOML_EXTERN(name, T) \
template optional<T> node::name<T>() const TOML_EXTERN_NOEXCEPT(impl::value_retrieval_is_nothrow<T>)
TOML_EXTERN(value_exact, std::string_view);
TOML_EXTERN(value_exact, std::string);
TOML_EXTERN(value_exact, const char*);
TOML_EXTERN(value_exact, int64_t);
TOML_EXTERN(value_exact, double);
TOML_EXTERN(value_exact, date);
TOML_EXTERN(value_exact, time);
TOML_EXTERN(value_exact, date_time);
TOML_EXTERN(value_exact, bool);
TOML_EXTERN(value, std::string_view);
TOML_EXTERN(value, std::string);
TOML_EXTERN(value, const char*);
TOML_EXTERN(value, signed char);
TOML_EXTERN(value, signed short);
TOML_EXTERN(value, signed int);
TOML_EXTERN(value, signed long);
TOML_EXTERN(value, signed long long);
TOML_EXTERN(value, unsigned char);
TOML_EXTERN(value, unsigned short);
TOML_EXTERN(value, unsigned int);
TOML_EXTERN(value, unsigned long);
TOML_EXTERN(value, unsigned long long);
TOML_EXTERN(value, double);
TOML_EXTERN(value, float);
TOML_EXTERN(value, date);
TOML_EXTERN(value, time);
TOML_EXTERN(value, date_time);
TOML_EXTERN(value, bool);
#if TOML_HAS_CHAR8
TOML_EXTERN(value_exact, std::u8string_view);
TOML_EXTERN(value_exact, std::u8string);
TOML_EXTERN(value_exact, const char8_t*);
TOML_EXTERN(value, std::u8string_view);
TOML_EXTERN(value, std::u8string);
TOML_EXTERN(value, const char8_t*);
#endif
#if TOML_WINDOWS_COMPAT
TOML_EXTERN(value_exact, std::wstring);
TOML_EXTERN(value, std::wstring);
#endif
#undef TOML_EXTERN
}
TOML_NAMESPACE_END;
#if (TOML_EXTERN_TEMPLATES && TOML_IMPLEMENTATION) || TOML_INTELLISENSE
#include "value_extern.inl"
#endif // TOML_EXTERN_TEMPLATES
#include "header_end.h"
#endif // TOML_EXTERN_TEMPLATES

View File

@ -0,0 +1,77 @@
//# This file is a part of toml++ and is subject to the the terms of the MIT license.
//# Copyright (c) Mark Gillard <mark.gillard@outlook.com.au>
//# See https://github.com/marzer/tomlplusplus/blob/master/LICENSE for the full license text.
// SPDX-License-Identifier: MIT
#pragma once
/// \cond
#include "value.h"
TOML_NAMESPACE_START
{
TOML_EXTERN
template class TOML_API value<std::string>;
TOML_EXTERN
template class TOML_API value<int64_t>;
TOML_EXTERN
template class TOML_API value<double>;
TOML_EXTERN
template class TOML_API value<bool>;
TOML_EXTERN
template class TOML_API value<date>;
TOML_EXTERN
template class TOML_API value<time>;
TOML_EXTERN
template class TOML_API value<date_time>;
#define TOML_EXTERN_FUNC(name, T) \
TOML_EXTERN \
template TOML_API \
optional<T> node::name<T>() const TOML_EXTERN_NOEXCEPT(impl::value_retrieval_is_nothrow<T>)
TOML_EXTERN_FUNC(value_exact, std::string_view);
TOML_EXTERN_FUNC(value_exact, std::string);
TOML_EXTERN_FUNC(value_exact, const char*);
TOML_EXTERN_FUNC(value_exact, int64_t);
TOML_EXTERN_FUNC(value_exact, double);
TOML_EXTERN_FUNC(value_exact, date);
TOML_EXTERN_FUNC(value_exact, time);
TOML_EXTERN_FUNC(value_exact, date_time);
TOML_EXTERN_FUNC(value_exact, bool);
TOML_EXTERN_FUNC(value, std::string_view);
TOML_EXTERN_FUNC(value, std::string);
TOML_EXTERN_FUNC(value, const char*);
TOML_EXTERN_FUNC(value, signed char);
TOML_EXTERN_FUNC(value, signed short);
TOML_EXTERN_FUNC(value, signed int);
TOML_EXTERN_FUNC(value, signed long);
TOML_EXTERN_FUNC(value, signed long long);
TOML_EXTERN_FUNC(value, unsigned char);
TOML_EXTERN_FUNC(value, unsigned short);
TOML_EXTERN_FUNC(value, unsigned int);
TOML_EXTERN_FUNC(value, unsigned long);
TOML_EXTERN_FUNC(value, unsigned long long);
TOML_EXTERN_FUNC(value, double);
TOML_EXTERN_FUNC(value, float);
TOML_EXTERN_FUNC(value, date);
TOML_EXTERN_FUNC(value, time);
TOML_EXTERN_FUNC(value, date_time);
TOML_EXTERN_FUNC(value, bool);
#if TOML_HAS_CHAR8
TOML_EXTERN_FUNC(value_exact, std::u8string_view);
TOML_EXTERN_FUNC(value_exact, std::u8string);
TOML_EXTERN_FUNC(value_exact, const char8_t*);
TOML_EXTERN_FUNC(value, std::u8string_view);
TOML_EXTERN_FUNC(value, std::u8string);
TOML_EXTERN_FUNC(value, const char8_t*);
#endif
#if TOML_WINDOWS_COMPAT
TOML_EXTERN_FUNC(value_exact, std::wstring);
TOML_EXTERN_FUNC(value, std::wstring);
#endif
#undef TOML_EXTERN_FUNC
}
TOML_NAMESPACE_END;
/// \endcond

View File

@ -93,8 +93,8 @@ TOML_POP_WARNINGS;
#undef TOML_ENABLE_WARNINGS
#undef TOML_EVAL_BOOL_0
#undef TOML_EVAL_BOOL_1
#undef TOML_EXTERN
#undef TOML_EXTERN_NOEXCEPT
#undef TOML_EXTERN_TEMPLATES
#undef TOML_EXTERNAL_LINKAGE
#undef TOML_FLOAT_CHARCONV
#undef TOML_FLOAT128

View File

@ -72,6 +72,7 @@
<ClInclude Include="include\toml++\impl\utf8.h" />
<ClInclude Include="include\toml++\impl\value.h" />
<ClInclude Include="include\toml++\impl\value.inl" />
<ClInclude Include="include\toml++\impl\value_extern.inl" />
<ClInclude Include="include\toml++\impl\version.h" />
<ClInclude Include="include\toml++\impl\std_string.inl" />
<ClInclude Include="include\toml++\toml.h" />
@ -85,6 +86,7 @@
<None Include=".runsettings" />
<None Include="CODE_OF_CONDUCT.md" />
<None Include="CONTRIBUTING.md" />
<None Include="include\toml++\impl\node_view_extern.inl" />
<None Include="LICENSE" />
<None Include="README.md" />
<None Include="cmake\install-rules.cmake" />

View File

@ -121,6 +121,9 @@
<ClInclude Include="include\toml++\impl\std_initializer_list.h">
<Filter>include\impl</Filter>
</ClInclude>
<ClInclude Include="include\toml++\impl\value_extern.inl">
<Filter>include\impl</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="toml++.props" />
@ -177,6 +180,9 @@
<None Include="tools\clang_format.bat">
<Filter>tools</Filter>
</None>
<None Include="include\toml++\impl\node_view_extern.inl">
<Filter>include\impl</Filter>
</None>
</ItemGroup>
<ItemGroup>
<Filter Include=".circleci">

451
toml.hpp
View File

@ -370,7 +370,7 @@
#ifndef TOML_EXTERN_TEMPLATES
#define TOML_EXTERN_TEMPLATES 1
#endif
#if (defined(DOXYGEN) || TOML_HEADER_ONLY) && !TOML_INTELLISENSE
#if (defined(DOXYGEN) || TOML_HEADER_ONLY)
#undef TOML_EXTERN_TEMPLATES
#define TOML_EXTERN_TEMPLATES 0
#endif
@ -665,6 +665,11 @@
#define POXY_IMPLEMENTATION_DETAIL(...) __VA_ARGS__
#endif
#if TOML_IMPLEMENTATION
#define TOML_EXTERN
#else
#define TOML_EXTERN extern
#endif
#if TOML_CLANG
#define TOML_EXTERN_NOEXCEPT(...)
#else
@ -3294,65 +3299,77 @@ TOML_NAMESPACE_START
template <typename T>
node_view(T*) -> node_view<node>;
}
TOML_NAMESPACE_END;
#if TOML_EXTERN_TEMPLATES
#if (TOML_EXTERN_TEMPLATES && !TOML_IMPLEMENTATION) || TOML_INTELLISENSE
extern template class TOML_API node_view<node>;
extern template class TOML_API node_view<const node>;
TOML_NAMESPACE_START
{
TOML_EXTERN
template class TOML_API node_view<node>;
TOML_EXTERN
template class TOML_API node_view<const node>;
#define TOML_EXTERN(name, T) \
extern template TOML_API \
#define TOML_EXTERN_FUNC(name, T) \
TOML_EXTERN \
template TOML_API \
optional<T> node_view<node>::name<T>() const TOML_EXTERN_NOEXCEPT(impl::value_retrieval_is_nothrow<T>); \
extern template TOML_API \
TOML_EXTERN \
template TOML_API \
optional<T> node_view<const node>::name<T>() const TOML_EXTERN_NOEXCEPT(impl::value_retrieval_is_nothrow<T>)
TOML_EXTERN(value_exact, std::string_view);
TOML_EXTERN(value_exact, std::string);
TOML_EXTERN(value_exact, const char*);
TOML_EXTERN(value_exact, int64_t);
TOML_EXTERN(value_exact, double);
TOML_EXTERN(value_exact, date);
TOML_EXTERN(value_exact, time);
TOML_EXTERN(value_exact, date_time);
TOML_EXTERN(value_exact, bool);
TOML_EXTERN(value, std::string_view);
TOML_EXTERN(value, std::string);
TOML_EXTERN(value, const char*);
TOML_EXTERN(value, signed char);
TOML_EXTERN(value, signed short);
TOML_EXTERN(value, signed int);
TOML_EXTERN(value, signed long);
TOML_EXTERN(value, signed long long);
TOML_EXTERN(value, unsigned char);
TOML_EXTERN(value, unsigned short);
TOML_EXTERN(value, unsigned int);
TOML_EXTERN(value, unsigned long);
TOML_EXTERN(value, unsigned long long);
TOML_EXTERN(value, double);
TOML_EXTERN(value, float);
TOML_EXTERN(value, date);
TOML_EXTERN(value, time);
TOML_EXTERN(value, date_time);
TOML_EXTERN(value, bool);
TOML_EXTERN_FUNC(value_exact, std::string_view);
TOML_EXTERN_FUNC(value_exact, std::string);
TOML_EXTERN_FUNC(value_exact, const char*);
TOML_EXTERN_FUNC(value_exact, int64_t);
TOML_EXTERN_FUNC(value_exact, double);
TOML_EXTERN_FUNC(value_exact, date);
TOML_EXTERN_FUNC(value_exact, time);
TOML_EXTERN_FUNC(value_exact, date_time);
TOML_EXTERN_FUNC(value_exact, bool);
TOML_EXTERN_FUNC(value, std::string_view);
TOML_EXTERN_FUNC(value, std::string);
TOML_EXTERN_FUNC(value, const char*);
TOML_EXTERN_FUNC(value, signed char);
TOML_EXTERN_FUNC(value, signed short);
TOML_EXTERN_FUNC(value, signed int);
TOML_EXTERN_FUNC(value, signed long);
TOML_EXTERN_FUNC(value, signed long long);
TOML_EXTERN_FUNC(value, unsigned char);
TOML_EXTERN_FUNC(value, unsigned short);
TOML_EXTERN_FUNC(value, unsigned int);
TOML_EXTERN_FUNC(value, unsigned long);
TOML_EXTERN_FUNC(value, unsigned long long);
TOML_EXTERN_FUNC(value, double);
TOML_EXTERN_FUNC(value, float);
TOML_EXTERN_FUNC(value, date);
TOML_EXTERN_FUNC(value, time);
TOML_EXTERN_FUNC(value, date_time);
TOML_EXTERN_FUNC(value, bool);
#if TOML_HAS_CHAR8
TOML_EXTERN(value_exact, std::u8string_view);
TOML_EXTERN(value_exact, std::u8string);
TOML_EXTERN(value_exact, const char8_t*);
TOML_EXTERN(value, std::u8string_view);
TOML_EXTERN(value, std::u8string);
TOML_EXTERN(value, const char8_t*);
TOML_EXTERN_FUNC(value_exact, std::u8string_view);
TOML_EXTERN_FUNC(value_exact, std::u8string);
TOML_EXTERN_FUNC(value_exact, const char8_t*);
TOML_EXTERN_FUNC(value, std::u8string_view);
TOML_EXTERN_FUNC(value, std::u8string);
TOML_EXTERN_FUNC(value, const char8_t*);
#endif
#if TOML_WINDOWS_COMPAT
TOML_EXTERN(value_exact, std::wstring);
TOML_EXTERN(value, std::wstring);
TOML_EXTERN_FUNC(value_exact, std::wstring);
TOML_EXTERN_FUNC(value, std::wstring);
#endif
#undef TOML_EXTERN
#undef TOML_EXTERN_FUNC
}
TOML_NAMESPACE_END;
#endif // TOML_EXTERN_TEMPLATES
#endif
TOML_NAMESPACE_START
{
inline node::operator node_view<node>() noexcept
{
return node_view<node>(this);
@ -4324,70 +4341,80 @@ TOML_NAMESPACE_START
}
}
}
#if TOML_EXTERN_TEMPLATES
extern template class TOML_API value<std::string>;
extern template class TOML_API value<int64_t>;
extern template class TOML_API value<double>;
extern template class TOML_API value<bool>;
extern template class TOML_API value<date>;
extern template class TOML_API value<time>;
extern template class TOML_API value<date_time>;
#define TOML_EXTERN(name, T) \
extern template TOML_API \
optional<T> node::name<T>() const TOML_EXTERN_NOEXCEPT(impl::value_retrieval_is_nothrow<T>)
TOML_EXTERN(value_exact, std::string_view);
TOML_EXTERN(value_exact, std::string);
TOML_EXTERN(value_exact, const char*);
TOML_EXTERN(value_exact, int64_t);
TOML_EXTERN(value_exact, double);
TOML_EXTERN(value_exact, date);
TOML_EXTERN(value_exact, time);
TOML_EXTERN(value_exact, date_time);
TOML_EXTERN(value_exact, bool);
TOML_EXTERN(value, std::string_view);
TOML_EXTERN(value, std::string);
TOML_EXTERN(value, const char*);
TOML_EXTERN(value, signed char);
TOML_EXTERN(value, signed short);
TOML_EXTERN(value, signed int);
TOML_EXTERN(value, signed long);
TOML_EXTERN(value, signed long long);
TOML_EXTERN(value, unsigned char);
TOML_EXTERN(value, unsigned short);
TOML_EXTERN(value, unsigned int);
TOML_EXTERN(value, unsigned long);
TOML_EXTERN(value, unsigned long long);
TOML_EXTERN(value, double);
TOML_EXTERN(value, float);
TOML_EXTERN(value, date);
TOML_EXTERN(value, time);
TOML_EXTERN(value, date_time);
TOML_EXTERN(value, bool);
#if TOML_HAS_CHAR8
TOML_EXTERN(value_exact, std::u8string_view);
TOML_EXTERN(value_exact, std::u8string);
TOML_EXTERN(value_exact, const char8_t*);
TOML_EXTERN(value, std::u8string_view);
TOML_EXTERN(value, std::u8string);
TOML_EXTERN(value, const char8_t*);
#endif
#if TOML_WINDOWS_COMPAT
TOML_EXTERN(value_exact, std::wstring);
TOML_EXTERN(value, std::wstring);
#endif
#undef TOML_EXTERN
#endif // TOML_EXTERN_TEMPLATES
}
TOML_NAMESPACE_END;
#if (TOML_EXTERN_TEMPLATES && !TOML_IMPLEMENTATION) || TOML_INTELLISENSE
TOML_NAMESPACE_START
{
TOML_EXTERN
template class TOML_API value<std::string>;
TOML_EXTERN
template class TOML_API value<int64_t>;
TOML_EXTERN
template class TOML_API value<double>;
TOML_EXTERN
template class TOML_API value<bool>;
TOML_EXTERN
template class TOML_API value<date>;
TOML_EXTERN
template class TOML_API value<time>;
TOML_EXTERN
template class TOML_API value<date_time>;
#define TOML_EXTERN_FUNC(name, T) \
TOML_EXTERN \
template TOML_API \
optional<T> node::name<T>() const TOML_EXTERN_NOEXCEPT(impl::value_retrieval_is_nothrow<T>)
TOML_EXTERN_FUNC(value_exact, std::string_view);
TOML_EXTERN_FUNC(value_exact, std::string);
TOML_EXTERN_FUNC(value_exact, const char*);
TOML_EXTERN_FUNC(value_exact, int64_t);
TOML_EXTERN_FUNC(value_exact, double);
TOML_EXTERN_FUNC(value_exact, date);
TOML_EXTERN_FUNC(value_exact, time);
TOML_EXTERN_FUNC(value_exact, date_time);
TOML_EXTERN_FUNC(value_exact, bool);
TOML_EXTERN_FUNC(value, std::string_view);
TOML_EXTERN_FUNC(value, std::string);
TOML_EXTERN_FUNC(value, const char*);
TOML_EXTERN_FUNC(value, signed char);
TOML_EXTERN_FUNC(value, signed short);
TOML_EXTERN_FUNC(value, signed int);
TOML_EXTERN_FUNC(value, signed long);
TOML_EXTERN_FUNC(value, signed long long);
TOML_EXTERN_FUNC(value, unsigned char);
TOML_EXTERN_FUNC(value, unsigned short);
TOML_EXTERN_FUNC(value, unsigned int);
TOML_EXTERN_FUNC(value, unsigned long);
TOML_EXTERN_FUNC(value, unsigned long long);
TOML_EXTERN_FUNC(value, double);
TOML_EXTERN_FUNC(value, float);
TOML_EXTERN_FUNC(value, date);
TOML_EXTERN_FUNC(value, time);
TOML_EXTERN_FUNC(value, date_time);
TOML_EXTERN_FUNC(value, bool);
#if TOML_HAS_CHAR8
TOML_EXTERN_FUNC(value_exact, std::u8string_view);
TOML_EXTERN_FUNC(value_exact, std::u8string);
TOML_EXTERN_FUNC(value_exact, const char8_t*);
TOML_EXTERN_FUNC(value, std::u8string_view);
TOML_EXTERN_FUNC(value, std::u8string);
TOML_EXTERN_FUNC(value, const char8_t*);
#endif
#if TOML_WINDOWS_COMPAT
TOML_EXTERN_FUNC(value_exact, std::wstring);
TOML_EXTERN_FUNC(value, std::wstring);
#endif
#undef TOML_EXTERN_FUNC
}
TOML_NAMESPACE_END;
#endif
TOML_POP_WARNINGS;
//******** impl/make_node.h ******************************************************************************************
@ -8285,145 +8312,157 @@ TOML_POP_WARNINGS;
//******** impl/node_view.inl ****************************************************************************************
#if TOML_EXTERN_TEMPLATES
TOML_PUSH_WARNINGS;
TOML_DISABLE_SPAM_WARNINGS;
TOML_DISABLE_SWITCH_WARNINGS;
#if (TOML_EXTERN_TEMPLATES && TOML_IMPLEMENTATION) || TOML_INTELLISENSE
TOML_NAMESPACE_START
{
template class node_view<node>;
template class node_view<const node>;
TOML_EXTERN
template class TOML_API node_view<node>;
TOML_EXTERN
template class TOML_API node_view<const node>;
#define TOML_EXTERN(name, T) \
template optional<T> node_view<node>::name<T>() const TOML_EXTERN_NOEXCEPT(impl::value_retrieval_is_nothrow<T>); \
template optional<T> node_view<const node>::name<T>() \
const TOML_EXTERN_NOEXCEPT(impl::value_retrieval_is_nothrow<T>)
#define TOML_EXTERN_FUNC(name, T) \
TOML_EXTERN \
template TOML_API \
optional<T> node_view<node>::name<T>() const TOML_EXTERN_NOEXCEPT(impl::value_retrieval_is_nothrow<T>); \
TOML_EXTERN \
template TOML_API \
optional<T> node_view<const node>::name<T>() const TOML_EXTERN_NOEXCEPT(impl::value_retrieval_is_nothrow<T>)
TOML_EXTERN(value_exact, std::string_view);
TOML_EXTERN(value_exact, std::string);
TOML_EXTERN(value_exact, const char*);
TOML_EXTERN(value_exact, int64_t);
TOML_EXTERN(value_exact, double);
TOML_EXTERN(value_exact, date);
TOML_EXTERN(value_exact, time);
TOML_EXTERN(value_exact, date_time);
TOML_EXTERN(value_exact, bool);
TOML_EXTERN(value, std::string_view);
TOML_EXTERN(value, std::string);
TOML_EXTERN(value, const char*);
TOML_EXTERN(value, signed char);
TOML_EXTERN(value, signed short);
TOML_EXTERN(value, signed int);
TOML_EXTERN(value, signed long);
TOML_EXTERN(value, signed long long);
TOML_EXTERN(value, unsigned char);
TOML_EXTERN(value, unsigned short);
TOML_EXTERN(value, unsigned int);
TOML_EXTERN(value, unsigned long);
TOML_EXTERN(value, unsigned long long);
TOML_EXTERN(value, double);
TOML_EXTERN(value, float);
TOML_EXTERN(value, date);
TOML_EXTERN(value, time);
TOML_EXTERN(value, date_time);
TOML_EXTERN(value, bool);
TOML_EXTERN_FUNC(value_exact, std::string_view);
TOML_EXTERN_FUNC(value_exact, std::string);
TOML_EXTERN_FUNC(value_exact, const char*);
TOML_EXTERN_FUNC(value_exact, int64_t);
TOML_EXTERN_FUNC(value_exact, double);
TOML_EXTERN_FUNC(value_exact, date);
TOML_EXTERN_FUNC(value_exact, time);
TOML_EXTERN_FUNC(value_exact, date_time);
TOML_EXTERN_FUNC(value_exact, bool);
TOML_EXTERN_FUNC(value, std::string_view);
TOML_EXTERN_FUNC(value, std::string);
TOML_EXTERN_FUNC(value, const char*);
TOML_EXTERN_FUNC(value, signed char);
TOML_EXTERN_FUNC(value, signed short);
TOML_EXTERN_FUNC(value, signed int);
TOML_EXTERN_FUNC(value, signed long);
TOML_EXTERN_FUNC(value, signed long long);
TOML_EXTERN_FUNC(value, unsigned char);
TOML_EXTERN_FUNC(value, unsigned short);
TOML_EXTERN_FUNC(value, unsigned int);
TOML_EXTERN_FUNC(value, unsigned long);
TOML_EXTERN_FUNC(value, unsigned long long);
TOML_EXTERN_FUNC(value, double);
TOML_EXTERN_FUNC(value, float);
TOML_EXTERN_FUNC(value, date);
TOML_EXTERN_FUNC(value, time);
TOML_EXTERN_FUNC(value, date_time);
TOML_EXTERN_FUNC(value, bool);
#if TOML_HAS_CHAR8
TOML_EXTERN(value_exact, std::u8string_view);
TOML_EXTERN(value_exact, std::u8string);
TOML_EXTERN(value_exact, const char8_t*);
TOML_EXTERN(value, std::u8string_view);
TOML_EXTERN(value, std::u8string);
TOML_EXTERN(value, const char8_t*);
TOML_EXTERN_FUNC(value_exact, std::u8string_view);
TOML_EXTERN_FUNC(value_exact, std::u8string);
TOML_EXTERN_FUNC(value_exact, const char8_t*);
TOML_EXTERN_FUNC(value, std::u8string_view);
TOML_EXTERN_FUNC(value, std::u8string);
TOML_EXTERN_FUNC(value, const char8_t*);
#endif
#if TOML_WINDOWS_COMPAT
TOML_EXTERN(value_exact, std::wstring);
TOML_EXTERN(value, std::wstring);
TOML_EXTERN_FUNC(value_exact, std::wstring);
TOML_EXTERN_FUNC(value, std::wstring);
#endif
#undef TOML_EXTERN
#undef TOML_EXTERN_FUNC
}
TOML_NAMESPACE_END;
TOML_POP_WARNINGS;
#endif // TOML_EXTERN_TEMPLATES
TOML_POP_WARNINGS;
//******** impl/value.inl ********************************************************************************************
#if TOML_EXTERN_TEMPLATES
TOML_PUSH_WARNINGS;
TOML_DISABLE_SPAM_WARNINGS;
TOML_DISABLE_SWITCH_WARNINGS;
#if (TOML_EXTERN_TEMPLATES && TOML_IMPLEMENTATION) || TOML_INTELLISENSE
TOML_NAMESPACE_START
{
template class value<std::string>;
template class value<int64_t>;
template class value<double>;
template class value<bool>;
template class value<date>;
template class value<time>;
template class value<date_time>;
TOML_EXTERN
template class TOML_API value<std::string>;
TOML_EXTERN
template class TOML_API value<int64_t>;
TOML_EXTERN
template class TOML_API value<double>;
TOML_EXTERN
template class TOML_API value<bool>;
TOML_EXTERN
template class TOML_API value<date>;
TOML_EXTERN
template class TOML_API value<time>;
TOML_EXTERN
template class TOML_API value<date_time>;
#define TOML_EXTERN(name, T) \
template optional<T> node::name<T>() const TOML_EXTERN_NOEXCEPT(impl::value_retrieval_is_nothrow<T>)
TOML_EXTERN(value_exact, std::string_view);
TOML_EXTERN(value_exact, std::string);
TOML_EXTERN(value_exact, const char*);
TOML_EXTERN(value_exact, int64_t);
TOML_EXTERN(value_exact, double);
TOML_EXTERN(value_exact, date);
TOML_EXTERN(value_exact, time);
TOML_EXTERN(value_exact, date_time);
TOML_EXTERN(value_exact, bool);
TOML_EXTERN(value, std::string_view);
TOML_EXTERN(value, std::string);
TOML_EXTERN(value, const char*);
TOML_EXTERN(value, signed char);
TOML_EXTERN(value, signed short);
TOML_EXTERN(value, signed int);
TOML_EXTERN(value, signed long);
TOML_EXTERN(value, signed long long);
TOML_EXTERN(value, unsigned char);
TOML_EXTERN(value, unsigned short);
TOML_EXTERN(value, unsigned int);
TOML_EXTERN(value, unsigned long);
TOML_EXTERN(value, unsigned long long);
TOML_EXTERN(value, double);
TOML_EXTERN(value, float);
TOML_EXTERN(value, date);
TOML_EXTERN(value, time);
TOML_EXTERN(value, date_time);
TOML_EXTERN(value, bool);
#define TOML_EXTERN_FUNC(name, T) \
TOML_EXTERN \
template TOML_API \
optional<T> node::name<T>() const TOML_EXTERN_NOEXCEPT(impl::value_retrieval_is_nothrow<T>)
TOML_EXTERN_FUNC(value_exact, std::string_view);
TOML_EXTERN_FUNC(value_exact, std::string);
TOML_EXTERN_FUNC(value_exact, const char*);
TOML_EXTERN_FUNC(value_exact, int64_t);
TOML_EXTERN_FUNC(value_exact, double);
TOML_EXTERN_FUNC(value_exact, date);
TOML_EXTERN_FUNC(value_exact, time);
TOML_EXTERN_FUNC(value_exact, date_time);
TOML_EXTERN_FUNC(value_exact, bool);
TOML_EXTERN_FUNC(value, std::string_view);
TOML_EXTERN_FUNC(value, std::string);
TOML_EXTERN_FUNC(value, const char*);
TOML_EXTERN_FUNC(value, signed char);
TOML_EXTERN_FUNC(value, signed short);
TOML_EXTERN_FUNC(value, signed int);
TOML_EXTERN_FUNC(value, signed long);
TOML_EXTERN_FUNC(value, signed long long);
TOML_EXTERN_FUNC(value, unsigned char);
TOML_EXTERN_FUNC(value, unsigned short);
TOML_EXTERN_FUNC(value, unsigned int);
TOML_EXTERN_FUNC(value, unsigned long);
TOML_EXTERN_FUNC(value, unsigned long long);
TOML_EXTERN_FUNC(value, double);
TOML_EXTERN_FUNC(value, float);
TOML_EXTERN_FUNC(value, date);
TOML_EXTERN_FUNC(value, time);
TOML_EXTERN_FUNC(value, date_time);
TOML_EXTERN_FUNC(value, bool);
#if TOML_HAS_CHAR8
TOML_EXTERN(value_exact, std::u8string_view);
TOML_EXTERN(value_exact, std::u8string);
TOML_EXTERN(value_exact, const char8_t*);
TOML_EXTERN(value, std::u8string_view);
TOML_EXTERN(value, std::u8string);
TOML_EXTERN(value, const char8_t*);
TOML_EXTERN_FUNC(value_exact, std::u8string_view);
TOML_EXTERN_FUNC(value_exact, std::u8string);
TOML_EXTERN_FUNC(value_exact, const char8_t*);
TOML_EXTERN_FUNC(value, std::u8string_view);
TOML_EXTERN_FUNC(value, std::u8string);
TOML_EXTERN_FUNC(value, const char8_t*);
#endif
#if TOML_WINDOWS_COMPAT
TOML_EXTERN(value_exact, std::wstring);
TOML_EXTERN(value, std::wstring);
TOML_EXTERN_FUNC(value_exact, std::wstring);
TOML_EXTERN_FUNC(value, std::wstring);
#endif
#undef TOML_EXTERN
#undef TOML_EXTERN_FUNC
}
TOML_NAMESPACE_END;
TOML_POP_WARNINGS;
#endif // TOML_EXTERN_TEMPLATES
TOML_POP_WARNINGS;
//******** impl/array.inl ********************************************************************************************
TOML_PUSH_WARNINGS;
@ -13259,8 +13298,8 @@ TOML_POP_WARNINGS;
#undef TOML_ENABLE_WARNINGS
#undef TOML_EVAL_BOOL_0
#undef TOML_EVAL_BOOL_1
#undef TOML_EXTERN
#undef TOML_EXTERN_NOEXCEPT
#undef TOML_EXTERN_TEMPLATES
#undef TOML_EXTERNAL_LINKAGE
#undef TOML_FLOAT_CHARCONV
#undef TOML_FLOAT128

View File

@ -18,7 +18,9 @@ class Preprocessor:
__re_includes = re.compile(r'^\s*#\s*include\s+"(.+?)".*?$', re.I | re.M)
__multiples_allowed = [
r'impl/header_start.h',
r'impl/header_end.h'
r'impl/header_end.h',
r'impl/value_extern.inl',
r'impl/node_view_extern.inl',
]
def __init__(self, file):
@ -194,6 +196,7 @@ def main():
r'TOML_API',
r'TOML_CONFIG_HEADER',
r'TOML_EXCEPTIONS',
r'TOML_EXTERN_TEMPLATES',
r'TOML_HEADER_ONLY',
r'TOML_LANG_MAJOR',
r'TOML_LANG_MINOR',