Skip to content

Commit 67c0b8a

Browse files
authored
Merge pull request #56 from flexferrum/boost_submodule
Make boost dependency as submodule
2 parents 6cd8e31 + a82647b commit 67c0b8a

File tree

14 files changed

+89
-159
lines changed

14 files changed

+89
-159
lines changed

.gitmodules

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,7 @@
1010
[submodule "thirdparty/nonstd/value-ptr-lite"]
1111
path = thirdparty/nonstd/value-ptr-lite
1212
url = https://github.com/flexferrum/value-ptr-lite.git
13+
[submodule "thirdparty/boost"]
14+
path = thirdparty/boost
15+
url = https://github.com/Manu343726/boost-cmake.git
16+
branch = master

CMakeLists.txt

Lines changed: 46 additions & 112 deletions
Original file line numberDiff line numberDiff line change
@@ -1,158 +1,92 @@
1-
cmake_minimum_required(VERSION 3.0)
1+
cmake_minimum_required(VERSION 3.0.2)
22
project(Jinja2Cpp VERSION 0.5.0)
33

4-
list (APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
4+
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
55

6-
if(CMAKE_COMPILER_IS_GNUCXX AND COVERAGE_ENABLED)
7-
message (STATUS "This is DEBUG build with enabled Code Coverage")
8-
set (CMAKE_BUILD_TYPE Debug)
9-
include(code_coverage)
10-
setup_target_for_coverage(${PROJECT_NAME}_coverage jinja2cpp_tests coverage)
11-
endif()
12-
13-
set(GTEST_ROOT $ENV{GTEST_DIR} CACHE PATH "Path to GTest/GMock library root")
14-
if (NOT UNIX)
15-
set(BOOST_ROOT $ENV{BOOST_DIR} CACHE PATH "Path to boost library root")
16-
set(LIBRARY_TYPE STATIC CACHE PATH "Library link type")
17-
else ()
18-
set(BOOST_ROOT "/usr" CACHE PATH "Path to boost library root")
19-
set(LIBRARY_TYPE SHARED CACHE PATH "Library link type")
20-
endif ()
21-
22-
if (NOT DEFINED WITH_TESTS)
23-
set (WITH_TESTS TRUE)
24-
endif ()
25-
26-
set (EXTRA_TEST_LIBS "")
27-
set (CMAKE_CXX_STANDARD 14)
28-
set (CMAKE_CXX_STANDARD_REQUIRED ON)
6+
set(CMAKE_CXX_STANDARD 14)
7+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
298
if (${CMAKE_CXX_COMPILER_ID} MATCHES "Clang" OR ${CMAKE_CXX_COMPILER_ID} MATCHES "GNU")
309
if (NOT UNIX)
31-
set (EXTRA_TEST_LIBS "stdc++")
3210
set (CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-Wa,-mbig-obj")
33-
else ()
34-
include(CMakeFindDependencyMacro)
35-
find_dependency(Threads)
36-
set (EXTRA_TEST_LIBS Threads::Threads)
3711
endif ()
3812
else ()
13+
set (COMMON_MSVC_OPTS "/wd4503 /DBOOST_ALL_NO_LIB")
14+
3915
# MSVC
40-
if (NOT DEFINED Boost_USE_STATIC_LIBS)
41-
set (Boost_USE_STATIC_LIBS ON)
42-
endif ()
4316
if (NOT DEFINED MSVC_RUNTIME_TYPE)
4417
set (MSVC_RUNTIME_TYPE "/MD")
18+
set (gtest_force_shared_crt ON CACHE BOOL "" FORCE)
4519
endif ()
4620
if (CMAKE_BUILD_TYPE MATCHES "Debug")
47-
message("#######>>>>>>>>>>!!!!!!!!!!!!!! AAAAAAAAAAAAAAAAAAAAAAAAAAAA")
48-
set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${MSVC_RUNTIME_TYPE}d")
21+
set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${MSVC_RUNTIME_TYPE}d ${COMMON_MSVC_OPTS}")
4922
set (Boost_USE_DEBUG_RUNTIME ON)
5023
else ()
51-
set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${MSVC_RUNTIME_TYPE}")
52-
set (CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} ${MSVC_RUNTIME_TYPE}")
24+
set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${MSVC_RUNTIME_TYPE} ${COMMON_MSVC_OPTS}")
25+
set (CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} ${MSVC_RUNTIME_TYPE} ${COMMON_MSVC_OPTS}")
5326
set (CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "/PROFILE")
5427
set (Boost_USE_DEBUG_RUNTIME OFF)
5528
endif ()
56-
endif()
5729

58-
if("${GTEST_ROOT}" STREQUAL "" AND WITH_TESTS)
59-
set (THIRDPARTY_TARGETS ${THIRDPARTY_TARGETS} gtest)
6030
endif()
6131

62-
if(NOT "${BOOST_ROOT}" STREQUAL "")
63-
list (APPEND CMAKE_PREFIX_PATH ${BOOST_ROOT})
64-
set (Boost_DIR ${BOOST_ROOT})
65-
endif()
66-
67-
make_directory (${CMAKE_CURRENT_BINARY_DIR}/thirdparty)
68-
execute_process (
69-
COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS} ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty
70-
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/thirdparty
71-
RESULT_VARIABLE THIRDPARTY_BUILD_RESULT
72-
)
73-
74-
if (THIRDPARTY_BUILD_RESULT EQUAL 0 AND THIRDPARTY_TARGETS)
75-
execute_process (
76-
COMMAND ${CMAKE_COMMAND} --build . --target ${THIRDPARTY_TARGETS}
77-
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/thirdparty
78-
RESULT_VARIABLE THIRDPARTY_BUILD_RESULT
79-
)
80-
endif ()
81-
82-
if (NOT THIRDPARTY_BUILD_RESULT EQUAL 0)
83-
message (FATAL_ERROR "Can't build thirdparty libraries")
84-
endif ()
85-
86-
if("${GTEST_ROOT}" STREQUAL "" AND WITH_TESTS)
87-
set (GTEST_ROOT ${CMAKE_CURRENT_BINARY_DIR}/thirdparty/gtest/install)
88-
set (GTEST_SELF_BUILD ON)
89-
endif ()
32+
set(BOOST_CMAKE_LIBRARIES filesystem algorithm variant optional CACHE INTERNAL "")
33+
add_subdirectory(thirdparty/boost EXCLUDE_FROM_ALL)
34+
add_subdirectory(thirdparty/nonstd EXCLUDE_FROM_ALL)
9035

91-
if(NOT "${GTEST_ROOT}" STREQUAL "" AND WITH_TESTS)
92-
list (APPEND CMAKE_PREFIX_PATH ${GTEST_ROOT})
93-
set (Gtest_DIR ${GTEST_ROOT})
94-
message(STATUS "GTest library search path: ${Gtest_DIR}")
95-
if (NOT GTEST_SELF_BUILD)
96-
find_package(GTest)
97-
else ()
98-
set (Gtest_DIR ${GTEST_ROOT})
99-
find_package(GTest)
100-
endif ()
101-
if (NOT GTEST_INCLUDE_DIRS)
102-
if (MSVC AND NOT GTEST_INCLUDE_DIRS)
103-
set (GTEST_MSVC_SEARCH "MT")
104-
find_package(GTest)
105-
else ()
106-
set (GTEST_BOTH_LIBRARIES "optimized;${GTEST_ROOT}/lib/libgtest.a;debug;${GTEST_ROOT}/lib/libgtestd.a;optimized;${GTEST_ROOT}/lib/libgtest_main.a;debug;${GTEST_ROOT}/lib/libgtest_maind.a")
107-
set (GTEST_INCLUDE_DIRS ${GTEST_ROOT}/include)
108-
endif ()
109-
endif ()
36+
if("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}")
37+
set(JINJA2CPP_IS_MAIN_PROEJCT TRUE)
38+
else()
39+
set(JINJA2CPP_IS_MAIN_PROEJCT FALSE)
11040
endif()
11141

112-
if (WITH_TESTS)
113-
find_package(Boost COMPONENTS system filesystem REQUIRED)
114-
else ()
115-
find_package(Boost)
116-
endif ()
117-
118-
add_subdirectory (thirdparty/nonstd)
42+
option(JINJA2CPP_BUILD_TESTS "Build Jinja2Cpp unit tests" ${JINJA2CPP_IS_MAIN_PROEJCT})
11943

12044
include(collect_sources)
12145

122-
include_directories(
123-
${CMAKE_CURRENT_SOURCE_DIR}/include
124-
)
125-
12646
set (LIB_TARGET_NAME jinja2cpp)
12747

12848
CollectSources(Sources Headers ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src)
12949
CollectSources(PublicSources PublicHeaders ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/include)
13050

131-
if(CMAKE_COMPILER_IS_GNUCXX AND COVERAGE_ENABLED)
132-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage")
133-
endif()
134-
13551
add_library(${LIB_TARGET_NAME} STATIC
13652
${Sources}
13753
${Headers}
13854
${PublicHeaders}
13955
)
14056

141-
target_link_libraries(${LIB_TARGET_NAME} PUBLIC ThirdParty::nonstd Boost::boost) # Boost::system Boost::filesystem)
57+
target_link_libraries(${LIB_TARGET_NAME} PUBLIC ThirdParty::nonstd boost_variant boost_filesystem boost_algorithm)
14258

14359
target_include_directories(${LIB_TARGET_NAME}
144-
INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/include)
60+
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
61+
62+
63+
if(NOT MSVC)
64+
# Enable -Werror and -Wall on jinja2cpp target, ignoring warning errors from thirdparty libs
65+
include(CheckCXXCompilerFlag)
66+
check_cxx_compiler_flag(-Wno-error=parentheses COMPILER_HAS_WNO_ERROR_PARENTHESES_FLAG)
67+
check_cxx_compiler_flag(-Wno-error=deprecated-declarations COMPILER_HAS_WNO_ERROR_DEPRECATED_DECLARATIONS_FLAG)
68+
check_cxx_compiler_flag(-Wno-error=maybe-uninitialized COMPILER_HAS_WNO_ERROR_MAYBE_UNINITIALIZED_FLAG)
69+
70+
if(COMPILER_HAS_WNO_ERROR_PARENTHESES_FLAG)
71+
target_compile_options(boost_assert INTERFACE -Wno-error=parentheses)
72+
endif()
73+
if(COMPILER_HAS_WNO_ERROR_DEPRECATED_DECLARATIONS_FLAG)
74+
target_compile_options(boost_filesystem PRIVATE -Wno-error=deprecated-declarations)
75+
endif()
76+
if(COMPILER_HAS_WNO_ERROR_MAYBE_UNINITIALIZED_FLAG)
77+
target_compile_options(boost_variant INTERFACE -Wno-error=maybe-uninitialized)
78+
endif()
79+
80+
target_compile_options(${LIB_TARGET_NAME} PRIVATE -Wall -Werror)
81+
endif()
14582

146-
if (WITH_TESTS)
83+
if (JINJA2CPP_BUILD_TESTS)
14784
enable_testing()
148-
149-
include_directories(
150-
${GTEST_INCLUDE_DIRS}
151-
)
85+
add_subdirectory(thirdparty/gtest)
15286

15387
CollectSources(TestSources TestHeaders ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/test)
15488
add_executable(jinja2cpp_tests ${TestSources} ${TestHeaders})
155-
target_link_libraries(jinja2cpp_tests ${GTEST_BOTH_LIBRARIES} ${LIB_TARGET_NAME} ${EXTRA_TEST_LIBS} ${Boost_LIBRARIES})
89+
target_link_libraries(jinja2cpp_tests gtest gtest_main ${LIB_TARGET_NAME} ${EXTRA_TEST_LIBS})
15690

15791
add_custom_command(
15892
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/test_data/simple_template1.j2tpl
@@ -164,6 +98,8 @@ if (WITH_TESTS)
16498
add_custom_target(CopyTestData ALL
16599
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/test_data/simple_template1.j2tpl
166100
)
101+
102+
add_test(NAME jinja2cpp_tests COMMAND jinja2cpp_tests)
167103
endif ()
168104

169105
install(TARGETS ${LIB_TARGET_NAME}
@@ -176,5 +112,3 @@ install (DIRECTORY thirdparty/nonstd/expected-light/include/ DESTINATION include
176112
install (DIRECTORY thirdparty/nonstd/variant-light/include/ DESTINATION include)
177113
install (DIRECTORY thirdparty/nonstd/value-ptr-light/include/ DESTINATION include)
178114
install (FILES cmake/public/FindJinja2Cpp.cmake DESTINATION cmake)
179-
180-
add_test(NAME jinja2cpp_tests COMMAND jinja2cpp_tests)

include/jinja2cpp/reflected_value.h

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22
#define JINJA2_REFLECTED_VALUE_H
33

44
#include "value.h"
5+
#include <vector>
6+
#include <set>
7+
#include <cstddef>
8+
#include <string>
9+
#include <type_traits>
10+
#include <memory>
511

612
namespace jinja2
713
{
@@ -14,15 +20,18 @@ struct TypeReflectedImpl : std::integral_constant<bool, val>
1420
{
1521
};
1622

23+
template<typename T>
24+
using FieldAccessor = std::function<Value(const T&)>;
25+
1726
template<typename T>
1827
struct TypeReflected : TypeReflectedImpl<T, true>
1928
{
20-
using FieldAccessor = std::function<Value (const T& value)>;
29+
using FieldAccessor = jinja2::FieldAccessor<T>;
2130
};
2231

2332

2433

25-
template<typename T>
34+
template<typename T, typename = void>
2635
struct TypeReflection : TypeReflectedImpl<T, false>
2736
{
2837
};

src/error_info.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ void RenderErrorInfo(std::basic_ostream<CharT>& os, const ErrorInfoTpl<CharT>& e
140140
if (extraParams.size() > 1)
141141
{
142142
os << UNIVERSAL_STR(". Expected: ");
143-
for (int i = 1; i < extraParams.size(); ++ i)
143+
for (std::size_t i = 1; i < extraParams.size(); ++ i)
144144
{
145145
if (i != 1)
146146
os << UNIVERSAL_STR(", ");

src/expression_evaluator.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -425,9 +425,9 @@ ParsedArguments ParseCallParamsImpl(const T& args, const CallParams& params, boo
425425
++ argIdx;
426426
}
427427

428-
int startPosArg = firstMandatoryIdx == -1 ? 0 : firstMandatoryIdx;
429-
int curPosArg = startPosArg;
430-
int eatenPosArgs = 0;
428+
std::size_t startPosArg = firstMandatoryIdx == -1 ? 0 : firstMandatoryIdx;
429+
std::size_t curPosArg = startPosArg;
430+
std::size_t eatenPosArgs = 0;
431431

432432
// Determine the range for positional arguments scanning
433433
bool isFirstTime = true;
@@ -445,7 +445,7 @@ ParsedArguments ParseCallParamsImpl(const T& args, const CallParams& params, boo
445445
int prevNotFound = argsInfo[startPosArg].prevNotFound;
446446
if (prevNotFound != -1)
447447
{
448-
startPosArg = prevNotFound;
448+
startPosArg = static_cast<std::size_t>(prevNotFound);
449449
}
450450
else if (curPosArg == args.size())
451451
{
@@ -456,20 +456,20 @@ ParsedArguments ParseCallParamsImpl(const T& args, const CallParams& params, boo
456456
int nextPosArg = argsInfo[curPosArg].nextNotFound;
457457
if (nextPosArg == -1)
458458
break;
459-
curPosArg = nextPosArg;
459+
curPosArg = static_cast<std::size_t>(nextPosArg);
460460
}
461461
}
462462

463463
// Map positional params to the desired arguments
464-
int curArg = startPosArg;
465-
for (int idx = 0; idx < eatenPosArgs && curArg != -1; ++ idx, curArg = argsInfo[curArg].nextNotFound)
464+
auto curArg = static_cast<int>(startPosArg);
465+
for (std::size_t idx = 0; idx < eatenPosArgs && curArg != -1; ++ idx, curArg = argsInfo[curArg].nextNotFound)
466466
{
467467
result.args[argsInfo[curArg].info->name] = params.posParams[idx];
468468
argsInfo[curArg].state = Positional;
469469
}
470470

471471
// Fill default arguments (if missing) and check for mandatory
472-
for (int idx = 0; idx < argsInfo.size(); ++ idx)
472+
for (std::size_t idx = 0; idx < argsInfo.size(); ++ idx)
473473
{
474474
auto& argInfo = argsInfo[idx];
475475
switch (argInfo.state)

src/filters.cpp

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -244,9 +244,9 @@ InternalValue DictSort::Filter(const InternalValue& baseVal, RenderContext& cont
244244

245245
std::vector<KeyValuePair> tempVector;
246246
tempVector.reserve(map->GetSize());
247-
for (int64_t idx = 0; idx < map->GetSize(); ++ idx)
247+
for (std::size_t idx = 0; idx < map->GetSize(); ++ idx)
248248
{
249-
auto val = map->GetValueByIndex(idx);
249+
auto val = map->GetValueByIndex(static_cast<std::int64_t>(idx));
250250
auto kvVal = Get<KeyValuePair>(val);
251251
tempVector.push_back(std::move(kvVal));
252252
}
@@ -569,17 +569,6 @@ InternalValue SequenceAccessor::Filter(const InternalValue& baseVal, RenderConte
569569
return ConvertToBool(cmpRes);
570570
};
571571

572-
auto equalComparator = [&attrName, &compType](auto& val1, auto& val2) {
573-
InternalValue cmpRes;
574-
575-
if (IsEmpty(attrName))
576-
cmpRes = Apply2<visitors::BinaryMathOperation>(val1, val2, BinaryExpression::LogicalEq, compType);
577-
else
578-
cmpRes = Apply2<visitors::BinaryMathOperation>(Subscript(val1, attrName), Subscript(val2, attrName), BinaryExpression::LogicalEq, compType);
579-
580-
return ConvertToBool(cmpRes);
581-
};
582-
583572
switch (m_mode)
584573
{
585574
case FirstItemMode:
@@ -618,7 +607,7 @@ InternalValue SequenceAccessor::Filter(const InternalValue& baseVal, RenderConte
618607
case ReverseMode:
619608
{
620609
InternalValueList resultList(list.GetSize());
621-
for (int n = 0; n < list.GetSize(); ++ n)
610+
for (std::size_t n = 0; n < list.GetSize(); ++ n)
622611
resultList[list.GetSize() - n - 1] = list.GetValueByIndex(n);
623612

624613
result = ListAdapter::CreateAdapter(std::move(resultList));
@@ -661,7 +650,7 @@ InternalValue SequenceAccessor::Filter(const InternalValue& baseVal, RenderConte
661650

662651
int idx = 0;
663652
for (auto& v : list)
664-
items.push_back(std::move(Item{IsEmpty(attrName) ? v : Subscript(v, attrName), idx ++}));
653+
items.push_back(Item{IsEmpty(attrName) ? v : Subscript(v, attrName), idx ++});
665654

666655
std::sort(items.begin(), items.end(), [&compType](auto& i1, auto& i2) {
667656
auto cmpRes = Apply2<visitors::BinaryMathOperation>(i1.val, i2.val, BinaryExpression::LogicalLt, compType);
@@ -676,7 +665,7 @@ InternalValue SequenceAccessor::Filter(const InternalValue& baseVal, RenderConte
676665
});
677666
items.erase(end, items.end());
678667

679-
std::sort(items.begin(), items.end(), [&compType](auto& i1, auto& i2) {
668+
std::sort(items.begin(), items.end(), [](auto& i1, auto& i2) {
680669
return i1.idx < i2.idx;
681670
});
682671

@@ -830,7 +819,7 @@ struct ValueConverterImpl : visitors::BaseVisitor<>
830819
result = InternalValue(static_cast<double>(val));
831820
break;
832821
case ValueConverter::AbsMode:
833-
result = InternalValue(static_cast<int64_t>(abs(val)));
822+
result = InternalValue(static_cast<int64_t>(std::abs(val)));
834823
break;
835824
case ValueConverter::ToIntMode:
836825
case ValueConverter::RoundMode:

src/internal_value.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ class ListAdapter::Iterator
294294
void increment()
295295
{
296296
++ m_current;
297-
m_currentVal = m_current == m_list->GetSize() ? InternalValue() : m_list->GetValueByIndex(m_current);
297+
m_currentVal = m_current == static_cast<int64_t>(m_list->GetSize()) ? InternalValue() : m_list->GetValueByIndex(m_current);
298298
}
299299

300300
bool equal(const Iterator& other) const
@@ -303,7 +303,7 @@ class ListAdapter::Iterator
303303
return other.m_list == nullptr ? true : other.equal(*this);
304304

305305
if (other.m_list == nullptr)
306-
return m_current == m_list->GetSize();
306+
return m_current == static_cast<int64_t>(m_list->GetSize());
307307

308308
return this->m_list == other.m_list && this->m_current == other.m_current;
309309
}

0 commit comments

Comments
 (0)