Skip to content

Commit f3f0812

Browse files
committed
#186 Make jinja2cpp compilable with std versions of variant, string_view and optional types
1 parent 9eb9489 commit f3f0812

File tree

11 files changed

+173
-58
lines changed

11 files changed

+173
-58
lines changed

CMakeLists.txt

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ endif()
6464
if (${CMAKE_CXX_COMPILER_ID} MATCHES "Clang" OR ${CMAKE_CXX_COMPILER_ID} MATCHES "GNU")
6565
if (NOT UNIX)
6666
if (${CMAKE_CXX_COMPILER_ID} MATCHES "GNU")
67-
set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-Wa,-mbig-obj -O1")
67+
set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-Wa,-mbig-obj -O1 -ftemplate-backtrace-limit=0")
6868
else ()
6969
add_definitions(/D_CRT_SECURE_NO_WARNINGS)
7070
endif ()
@@ -165,28 +165,29 @@ target_include_directories(${LIB_TARGET_NAME}
165165
$<INSTALL_INTERFACE:include>
166166
)
167167

168-
if(JINJA2CPP_STRICT_WARNINGS)
169-
if(NOT MSVC)
170-
if (UNIX)
171-
target_compile_options(${LIB_TARGET_NAME} PRIVATE -Wall -Werror -Wno-unused-command-line-argument)
168+
if (JINJA2CPP_STRICT_WARNINGS)
169+
if (NOT MSVC)
170+
if (UNIX)
171+
target_compile_options(${LIB_TARGET_NAME} PRIVATE -Wall -Werror -Wno-unused-command-line-argument)
172+
endif ()
173+
else ()
174+
target_compile_options(${LIB_TARGET_NAME} PRIVATE /W4)
172175
endif ()
173-
else ()
174-
target_compile_options(${LIB_TARGET_NAME} PRIVATE /W4)
175-
endif()
176-
endif()
176+
endif ()
177177

178-
target_compile_definitions(${LIB_TARGET_NAME} PUBLIC variant_CONFIG_SELECT_VARIANT=variant_VARIANT_NONSTD nssv_CONFIG_SELECT_STRING_VIEW=nssv_STRING_VIEW_NONSTD optional_CONFIG_SELECT_OPTIONAL=optional_OPTIONAL_NONSTD BOOST_SYSTEM_NO_DEPRECATED BOOST_ERROR_CODE_HEADER_ONLY)
178+
# target_compile_definitions(${LIB_TARGET_NAME} PUBLIC variant_CONFIG_SELECT_VARIANT=variant_VARIANT_NONSTD nssv_CONFIG_SELECT_STRING_VIEW=nssv_STRING_VIEW_NONSTD optional_CONFIG_SELECT_OPTIONAL=optional_OPTIONAL_NONSTD BOOST_SYSTEM_NO_DEPRECATED BOOST_ERROR_CODE_HEADER_ONLY)
179+
target_compile_definitions(${LIB_TARGET_NAME} PUBLIC BOOST_SYSTEM_NO_DEPRECATED BOOST_ERROR_CODE_HEADER_ONLY)
179180

180181
set_target_properties(${LIB_TARGET_NAME} PROPERTIES
181-
VERSION ${PROJECT_VERSION}
182-
SOVERSION 1
183-
)
184-
182+
VERSION ${PROJECT_VERSION}
183+
SOVERSION 1
184+
)
185+
185186
set_target_properties(${LIB_TARGET_NAME} PROPERTIES
186-
CXX_STANDARD ${JINJA2CPP_CXX_STANDARD}
187-
CXX_STANDARD_REQUIRED ON
188-
)
189-
187+
CXX_STANDARD ${JINJA2CPP_CXX_STANDARD}
188+
CXX_STANDARD_REQUIRED ON
189+
)
190+
190191
set_property(TARGET ${LIB_TARGET_NAME} PROPERTY PUBLIC_HEADER ${PublicHeaders} ${JINJA2CPP_EXTRA_PUBLIC_HEADERS})
191192

192193
configure_file(jinja2cpp.pc.in jinja2cpp.pc @ONLY)

include/jinja2cpp/value.h

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,8 @@ class GenericMap
141141
};
142142

143143
using ValuesList = std::vector<Value>;
144-
using ValuesMap = std::unordered_map<std::string, Value>;
144+
// using ValuesMap = std::unordered_map<std::string, Value>;
145+
struct ValuesMap;
145146
struct UserCallableArgs;
146147
struct ParamInfo;
147148
struct UserCallable;
@@ -205,6 +206,7 @@ class Value
205206
//! Move constructor
206207
Value(Value&& val) noexcept;
207208
//! Desctructor
209+
// ~Value();
208210
~Value();
209211

210212
//! Assignment operator
@@ -463,25 +465,25 @@ class Value
463465
template<typename T>
464466
auto get()
465467
{
466-
return m_data.get<T>();
468+
return nonstd::get<T>(m_data);
467469
}
468470

469471
template<typename T>
470472
auto get() const
471473
{
472-
return m_data.get<T>();
474+
return nonstd::get<T>(m_data);
473475
}
474476

475477
template<typename T>
476478
auto getPtr()
477479
{
478-
return m_data.index() == ValueData::index_of<T>() ? &m_data.get<T>() : nullptr;
480+
return nonstd::get_if<T>(&m_data); // m_data.index() == ValueData::template index_of<T>() ? &m_data.get<T>() : nullptr;
479481
}
480482

481483
template<typename T>
482484
auto getPtr() const
483485
{
484-
return m_data.index() == ValueData::index_of<T>() ? &m_data.get<T>() : nullptr;
486+
return nonstd::get_if<T>(&m_data); // m_data.index() == ValueData::template index_of<T>() ? &m_data.get<T>() : nullptr;
485487
}
486488

487489
//! Test Value for emptyness
@@ -494,6 +496,10 @@ class Value
494496
ValueData m_data;
495497
};
496498

499+
struct ValuesMap : std::unordered_map<std::string, Value>
500+
{
501+
using unordered_map::unordered_map;
502+
};
497503

498504
/*!
499505
* \brief Information about user-callable parameters passed from Jinja2 call context

include/jinja2cpp/value_ptr.hpp

Lines changed: 103 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -587,15 +587,114 @@ struct nsvp_DECLSPEC_EMPTY_BASES compressed_ptr : Cloner, Deleter
587587
}
588588
#endif
589589

590-
void swap( compressed_ptr & other ) nsvp_noexcept
590+
void swap(compressed_ptr& other) nsvp_noexcept
591591
{
592592
using std::swap;
593-
swap( ptr, other.ptr );
593+
swap(ptr, other.ptr);
594594
}
595595

596596
pointer ptr;
597597
};
598598

599+
template<class T, class Cloner, class Deleter>
600+
struct nsvp_DECLSPEC_EMPTY_BASES new_compressed_ptr // : Cloner, Deleter
601+
{
602+
// typedef T element_type;
603+
typedef T* pointer;
604+
605+
typedef Cloner cloner_type;
606+
typedef Deleter deleter_type;
607+
608+
// Lifetime:
609+
610+
~new_compressed_ptr() {}
611+
612+
new_compressed_ptr() nsvp_noexcept {}
613+
614+
explicit new_compressed_ptr(pointer p) nsvp_noexcept {}
615+
616+
new_compressed_ptr(new_compressed_ptr const& other) {}
617+
618+
#if nsvp_CPP11_OR_GREATER
619+
new_compressed_ptr(new_compressed_ptr&& other) nsvp_noexcept {}
620+
#endif
621+
622+
explicit new_compressed_ptr(T const& value) {}
623+
624+
#if nsvp_CPP11_OR_GREATER
625+
626+
explicit new_compressed_ptr(T&& value) nsvp_noexcept {}
627+
628+
template<class... Args>
629+
explicit new_compressed_ptr(nonstd_lite_in_place_t(T), Args&&... args)
630+
{
631+
}
632+
633+
template<class U, class... Args>
634+
explicit new_compressed_ptr(nonstd_lite_in_place_t(T), std::initializer_list<U> il, Args&&... args)
635+
{
636+
}
637+
638+
#endif
639+
640+
new_compressed_ptr(T const& value, cloner_type const& cloner) {}
641+
642+
#if nsvp_CPP11_OR_GREATER
643+
new_compressed_ptr(T&& value, cloner_type&& cloner) nsvp_noexcept {}
644+
#endif
645+
646+
new_compressed_ptr(T const& value, cloner_type const& cloner, deleter_type const& deleter) {}
647+
648+
#if nsvp_CPP11_OR_GREATER
649+
new_compressed_ptr(T&& value, cloner_type&& cloner, deleter_type&& deleter) nsvp_noexcept {}
650+
#endif
651+
652+
explicit new_compressed_ptr(cloner_type const& cloner) {}
653+
654+
#if nsvp_CPP11_OR_GREATER
655+
explicit new_compressed_ptr(cloner_type&& cloner) nsvp_noexcept {}
656+
#endif
657+
658+
explicit new_compressed_ptr(deleter_type const& deleter) {}
659+
660+
#if nsvp_CPP11_OR_GREATER
661+
explicit new_compressed_ptr(deleter_type&& deleter) nsvp_noexcept {}
662+
#endif
663+
664+
new_compressed_ptr(cloner_type const& cloner, deleter_type const& deleter) {}
665+
666+
#if nsvp_CPP11_OR_GREATER
667+
new_compressed_ptr(cloner_type&& cloner, deleter_type&& deleter) nsvp_noexcept {}
668+
#endif
669+
670+
// Observers:
671+
672+
pointer get() const nsvp_noexcept { return nullptr; }
673+
674+
cloner_type& get_cloner() nsvp_noexcept { return *this; }
675+
676+
deleter_type& get_deleter() nsvp_noexcept { return *this; }
677+
678+
// Modifiers:
679+
680+
pointer release() nsvp_noexcept { return nullptr; }
681+
682+
void reset(pointer p) nsvp_noexcept {}
683+
684+
void reset(T const& v) {}
685+
686+
#if nsvp_CPP11_OR_GREATER
687+
void reset(T&& v) {}
688+
#endif
689+
690+
void swap(new_compressed_ptr& other) nsvp_noexcept {}
691+
692+
union {
693+
void* dummy;
694+
pointer ptr;
695+
};
696+
};
697+
599698
} // namespace detail
600699

601700
#if ! nsvp_CONFIG_NO_EXCEPTIONS
@@ -651,8 +750,8 @@ class value_ptr
651750
: ptr( p )
652751
{}
653752

654-
value_ptr( value_ptr const & other )
655-
: ptr( other.ptr )
753+
value_ptr(value_ptr const& other)
754+
: ptr(other.ptr)
656755
{}
657756

658757
#if nsvp_CPP11_OR_GREATER

src/filters.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -950,7 +950,7 @@ struct ValueConverterImpl : visitors::BaseVisitor<>
950950
break;
951951
}
952952
case ValueConverter::ToListMode:
953-
result = ListAdapter::CreateAdapter(val.size(), [str = val](size_t idx) { return InternalValue(str.substr(idx, 1)); });
953+
result = ListAdapter::CreateAdapter(val.size(), [str = val](size_t idx) { return InternalValue(TargetString(str.substr(idx, 1))); });
954954
default:
955955
break;
956956
}

src/internal_value.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,7 @@ class ValuesListAdapter : public IndexedListAccessorImpl<ValuesListAdapter<Holde
332332
size_t GetItemsCountImpl() const { return m_values.Get().size(); }
333333
nonstd::optional<InternalValue> GetItem(int64_t idx) const override
334334
{
335-
const auto& val = m_values.Get()[idx];
335+
const auto& val = m_values.Get()[static_cast<size_t>(idx)];
336336
return visit(visitors::InputValueConvertor(false, true), val.data()).get();
337337
}
338338
bool ShouldExtendLifetime() const override { return m_values.ShouldExtendLifetime(); }
@@ -723,19 +723,19 @@ struct OutputValueConvertor
723723
switch (str.index())
724724
{
725725
case 0:
726-
return str.get<std::string>();
726+
return nonstd::get<std::string>(str);
727727
default:
728-
return str.get<std::wstring>();
728+
return nonstd::get<std::wstring>(str);
729729
}
730730
}
731731
result_t operator()(const TargetStringView& str) const
732732
{
733733
switch (str.index())
734734
{
735735
case 0:
736-
return str.get<nonstd::string_view>();
736+
return nonstd::get<nonstd::string_view>(str);
737737
default:
738-
return str.get<nonstd::wstring_view>();
738+
return nonstd::get<nonstd::wstring_view>(str);
739739
}
740740
}
741741
result_t operator()(const KeyValuePair& pair) const { return ValuesMap{ { "key", Value(pair.key) }, { "value", IntValue2Value(pair.value) } }; }

src/internal_value.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -368,7 +368,7 @@ class InternalValue
368368

369369
template<typename T>
370370
InternalValue(T&& val, typename std::enable_if<!std::is_same<std::decay_t<T>, InternalValue>::value>::type* = nullptr)
371-
: m_data(std::forward<T>(val))
371+
: m_data(InternalValueData(std::forward<T>(val)))
372372
{
373373
}
374374

src/serialize_filters.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ struct CachingIdentity
225225
const auto& operator()(const T& t) const
226226
{
227227
m_values.push_back(t);
228-
return m_values.back().get<T>();
228+
return nonstd::get<T>(m_values.back());
229229
}
230230

231231
private:
@@ -245,11 +245,11 @@ class NamedArgumentCreator
245245
const auto& operator()(const T& t) const
246246
{
247247
m_valuesBuffer.push_back(m_name);
248-
const auto& name = m_valuesBuffer.back().get<std::string>();
248+
const auto& name = nonstd::get<std::string>(m_valuesBuffer.back());
249249
m_valuesBuffer.push_back(t);
250-
const auto& value = m_valuesBuffer.back().get<T>();
250+
const auto& value = nonstd::get<T>(m_valuesBuffer.back());
251251
m_valuesBuffer.emplace_back(fmt::arg(name, value));
252-
return m_valuesBuffer.back().get<NamedArgument<T>>();
252+
return nonstd::get<NamedArgument<T>>(m_valuesBuffer.back());
253253
}
254254

255255
private:

src/template_impl.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,7 @@ class TemplateImpl : public ITemplateImpl
319319
errorData.extraParams.push_back(Value(std::move(jsonError)));
320320
return nonstd::make_unexpected(ErrorInfoTpl<CharT>(errorData));
321321
}
322-
m_metadata = std::move(Reflect(m_metadataJson.value()).data().template get<GenericMap>());
322+
m_metadata = std::move(nonstd::get<GenericMap>(Reflect(m_metadataJson.value()).data()));
323323
return m_metadata.value();
324324
}
325325
return GenericMap();
@@ -358,7 +358,7 @@ class TemplateImpl : public ITemplateImpl
358358
{
359359
using string_t = std::basic_string<CharT>;
360360
str = string_t();
361-
return OutStream([writer = StringStreamWriter<CharT>(&str.get<string_t>())]() mutable -> OutStream::StreamWriter* {return &writer;});
361+
return OutStream([writer = StringStreamWriter<CharT>(&nonstd::get<string_t>(str))]() mutable -> OutStream::StreamWriter* { return &writer; });
362362
}
363363

364364
nonstd::variant<EmptyValue,

src/template_parser.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -739,7 +739,7 @@ class TemplateParser : public LexerHelper
739739
Token tok;
740740
tok.type = type;
741741
tok.range = range;
742-
tok.value = static_cast<string_t>(value);
742+
tok.value = TargetString(static_cast<string_t>(value));
743743

744744
return tok;
745745
}
@@ -891,7 +891,7 @@ class TemplateParser : public LexerHelper
891891
if (type == Token::String)
892892
{
893893
auto rawValue = CompileEscapes(m_template->substr(range.startOffset, range.size()));
894-
return InternalValue(std::move(rawValue));
894+
return InternalValue(TargetString(std::move(rawValue)));
895895
}
896896
if (type == Token::IntegerNum || type == Token::FloatNum)
897897
return traits_t::RangeToNum(*m_template, range, type);

0 commit comments

Comments
 (0)