Skip to content

Commit

Permalink
ScopedVars: Fixes, renaming, improved debugging
Browse files Browse the repository at this point in the history
  • Loading branch information
florianessl committed May 12, 2024
1 parent 0223796 commit e7a04ac
Show file tree
Hide file tree
Showing 14 changed files with 807 additions and 407 deletions.
2 changes: 2 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -461,6 +461,8 @@ add_library(${PROJECT_NAME} OBJECT
src/window_teleport.h
src/window_varlist.cpp
src/window_varlist.h
src/window_varlist_scoped.cpp
src/window_varlist_scoped.h
)

# These are actually unused when building in CMake
Expand Down
4 changes: 3 additions & 1 deletion Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -439,7 +439,9 @@ libeasyrpg_player_a_SOURCES = \
src/window_teleport.cpp \
src/window_teleport.h \
src/window_varlist.cpp \
src/window_varlist.h
src/window_varlist.h \
src/window_varlist_scoped.cpp \
src/window_varlist_scoped.h

SOURCEFILES_SDL2 = \
src/platform/sdl/sdl2_ui.cpp \
Expand Down
49 changes: 15 additions & 34 deletions src/game_interpreter_control_variables.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -333,7 +333,7 @@ int VarManagement::scopedValueOrVariable(int mode, int val, int map_id, int even

bool VarManagement::EvaluateMapTreeSwitch(int mode, int switch_id, int map_id) {
bool defined = false;
bool is_inherited_value = Main_Data::game_switches->scoped_map.GetIsInheritedValue(switch_id, map_id);
bool is_inherited_value = Main_Data::game_switches->scoped_map.IsInheritedValue(switch_id, map_id);
if (!is_inherited_value) {
if (mode == 0) {
return Main_Data::game_switches->Get<DataScopeType::eDataScope_Map>(switch_id, map_id);
Expand All @@ -344,14 +344,14 @@ bool VarManagement::EvaluateMapTreeSwitch(int mode, int switch_id, int map_id) {

int value;
if (mode == 0) {
defined = Main_Data::game_switches->scoped_map.GetIsDefined(switch_id, map_id);
defined = Main_Data::game_switches->scoped_map.IsDefined(switch_id, map_id);
if (defined) {
value = Main_Data::game_switches->Get<DataScopeType::eDataScope_Map>(switch_id, map_id);
if (value == 0)
defined = false;
}
} else {
defined = Main_Data::game_switches->scoped_map.GetIsDefined(Main_Data::game_variables->Get(switch_id), map_id);
defined = Main_Data::game_switches->scoped_map.IsDefined(Main_Data::game_variables->Get(switch_id), map_id);
if (defined) {
switch_id = Main_Data::game_variables->Get(switch_id);
value = Main_Data::game_switches->Get<DataScopeType::eDataScope_Map>(switch_id, map_id, 0);
Expand All @@ -371,41 +371,22 @@ bool VarManagement::EvaluateMapTreeSwitch(int mode, int switch_id, int map_id) {
}

int VarManagement::EvaluateMapTreeVariable(int mode, int var_id, int map_id) {
bool defined = false;
bool is_inherited_value = Main_Data::game_variables->scoped_map.GetIsInheritedValue(var_id, map_id);
if (!is_inherited_value) {
if (mode == 0) {
return Main_Data::game_variables->Get<DataScopeType::eDataScope_Map>(var_id, map_id);
} else {
return Main_Data::game_variables->Get<DataScopeType::eDataScope_Map>(var_id, map_id, 0);
}
}

int value;
if (mode == 0) {
defined = Main_Data::game_variables->scoped_map.GetIsDefined(var_id, map_id);
if (defined) {
value = Main_Data::game_variables->Get<DataScopeType::eDataScope_Map>(var_id, map_id);
if (value == 0)
defined = false;
}
} else {
defined = Main_Data::game_variables->scoped_map.GetIsDefined(Main_Data::game_variables->Get(var_id), map_id);
if (defined) {
value = Main_Data::game_variables->scopedGetIndirect<DataScopeType::eDataScope_Map, DataScopeType::eDataScope_Global>(var_id, map_id, 0);
if (value == 0)
defined = false;
}
}

if (!defined) {
auto get_parent_map_id = [](int map_id) {
auto map_info = Game_Map::GetMapInfo(map_id);
if (map_info.parent_map > 0) {
return EvaluateMapTreeVariable(mode, var_id, map_info.parent_map);
}
return map_info.parent_map;
};

if (mode == 1) {
var_id = Main_Data::game_variables->GetIndirect(var_id);
}

return -1;
int value = -1;
bool is_defined = Main_Data::game_variables->scoped_map.GetInherited(var_id, map_id, get_parent_map_id, value);
if (!is_defined && Main_Data::game_variables->scoped_map.IsDefaultValueDefined(var_id, map_id)) {
value = Main_Data::game_variables->scoped_map.GetDefaultValue(var_id);
}
return value;
}

namespace {
Expand Down
42 changes: 31 additions & 11 deletions src/game_scoped_storage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,19 @@ SCOPED_IMPL void Game_DataStorage<T, V, storage_mode>::PrepareRange(const int fi
ASSERT_IS_VARIABLE_SCOPE(S, "PrepareRange");

auto& storage = GetScopedStorageForEdit<S>(true, args...);
storage.data.prepare(first_id, std::max(last_id, static_cast<int>(GetLimit<S>())));

int prepare_last_id = std::max(last_id, static_cast<int>(GetLimit<S>())),
prepare_first_id = std::min(prepare_last_id, static_cast<int>(storage.data.data.size()) + 1);

if (prepare_first_id > prepare_last_id)
return;

storage.data.prepare(prepare_first_id, prepare_last_id);

for (int i = prepare_first_id; i <= prepare_last_id; i++) {
storage.flags[i - 1] = scopedInitFlags(S, i);
storage.data.data[i - 1] = scopedGetDefaultValue(S, i);
}
}
}
}
Expand Down Expand Up @@ -153,11 +165,19 @@ void Game_DataStorage<T, V, storage_mode>::ResetFrameData(bool main_flag) {
_frameParallelDataChanged = false;
}

template <typename T, typename V, VarStorage::DataStorageMode storage_mode>
template<DataScopeType S>
bool Game_DataStorage<T, V, storage_mode>::scopedIsStorageInitialized(int map_id, int event_id) const {
ASSERT_IS_VARIABLE_SCOPE(S, "scopedIsStorageInitialized");

auto& storage = GetScopedStorage<S>(map_id, event_id);
return storage.valid;
}

template <typename T, typename V, VarStorage::DataStorageMode storage_mode>
template<DataScopeType S>
bool Game_DataStorage<T, V, storage_mode>::scopedGetIsDefined(int id, int map_id, int event_id) const {
ASSERT_IS_VARIABLE_SCOPE(S, "scopedGetIsDefined");
bool Game_DataStorage<T, V, storage_mode>::scopedIsDefined(int id, int map_id, int event_id) const {
ASSERT_IS_VARIABLE_SCOPE(S, "scopedIsDefined");

auto& storage = GetScopedStorage<S>(map_id, event_id);
if (!storage.valid)
Expand All @@ -168,8 +188,8 @@ bool Game_DataStorage<T, V, storage_mode>::scopedGetIsDefined(int id, int map_id

template <typename T, typename V, VarStorage::DataStorageMode storage_mode>
template<DataScopeType S>
bool Game_DataStorage<T, V, storage_mode>::scopedGetIsReadOnly(int id, int map_id, int event_id) const {
ASSERT_IS_VARIABLE_SCOPE(S, "scopedGetIsReadOnly");
bool Game_DataStorage<T, V, storage_mode>::scopedIsReadOnly(int id, int map_id, int event_id) const {
ASSERT_IS_VARIABLE_SCOPE(S, "scopedIsReadOnly");

auto& storage = GetScopedStorage<S>(map_id, event_id);
if (!storage.valid) {
Expand All @@ -182,8 +202,8 @@ bool Game_DataStorage<T, V, storage_mode>::scopedGetIsReadOnly(int id, int map_i

template <typename T, typename V, VarStorage::DataStorageMode storage_mode>
template<DataScopeType S>
bool Game_DataStorage<T, V, storage_mode>::scopedGetIsDefaultValueDefined(int id, int map_id, int event_id) const {
ASSERT_IS_VARIABLE_SCOPE(S, "scopedGetIsDefaultValueDefined");
bool Game_DataStorage<T, V, storage_mode>::scopedIsDefaultValueDefined(int id, int map_id, int event_id) const {
ASSERT_IS_VARIABLE_SCOPE(S, "scopedIsDefaultValueDefined");

auto& storage = GetScopedStorage<S>(map_id, event_id);
if (!storage.valid) {
Expand All @@ -196,8 +216,8 @@ bool Game_DataStorage<T, V, storage_mode>::scopedGetIsDefaultValueDefined(int id

template <typename T, typename V, VarStorage::DataStorageMode storage_mode>
template<DataScopeType S>
bool Game_DataStorage<T, V, storage_mode>::scopedGetIsAutoReset(int id, int map_id, int event_id) const {
ASSERT_IS_VARIABLE_SCOPE(S, "scopedGetIsAutoReset");
bool Game_DataStorage<T, V, storage_mode>::scopedIsAutoReset(int id, int map_id, int event_id) const {
ASSERT_IS_VARIABLE_SCOPE(S, "scopedIsAutoReset");

auto& storage = GetScopedStorage<S>(map_id, event_id);
if (!storage.valid) {
Expand All @@ -210,8 +230,8 @@ bool Game_DataStorage<T, V, storage_mode>::scopedGetIsAutoReset(int id, int map_

template <typename T, typename V, VarStorage::DataStorageMode storage_mode>
template<DataScopeType S>
bool Game_DataStorage<T, V, storage_mode>::scopedGetIsInheritedValue(int id, int map_id) const {
ASSERT_IS_VARIABLE_SCOPE(S, "scopedGetIsInheritedValue");
bool Game_DataStorage<T, V, storage_mode>::scopedIsInheritedValue(int id, int map_id) const {
ASSERT_IS_VARIABLE_SCOPE(S, "scopedIsInheritedValue");

auto flags = scopedInitFlags(S, id);
return (ScopedDataStorage_t::eFlag_MapGrpInheritedValue & flags) > 0;
Expand Down
111 changes: 72 additions & 39 deletions src/game_scoped_storage.h
Original file line number Diff line number Diff line change
Expand Up @@ -308,12 +308,15 @@ class Game_DataStorage : public Game_DataStorageBase<T, V, storage_mode> {
Game_DataStorage<T, V, storage_mode>& _parent;
friend Game_DataStorage<T, V, storage_mode>;
public:
bool IsStorageInitialized(int map_id, int event_id = 0) const;
template<typename F>
bool GetInherited(int id, int map_id, F&& get_parent_id, V& out_val) const;
V GetDefaultValue(int id) const;
bool GetIsDefined(int id, int map_id, int event_id = 0) const;
bool GetIsReadOnly(int id, int map_id, int event_id = 0) const;
bool GetIsAutoReset(int id, int map_id, int event_id = 0) const;
bool GetIsDefaultValueDefined(int id, int map_id, int event_id = 0) const;
bool GetIsInheritedValue(int id, int map_id) const;
bool IsDefined(int id, int map_id, int event_id = 0) const;
bool IsReadOnly(int id, int map_id, int event_id = 0) const;
bool IsAutoReset(int id, int map_id, int event_id = 0) const;
bool IsDefaultValueDefined(int id, int map_id, int event_id = 0) const;
bool IsInheritedValue(int id, int map_id) const;
int CountElementsDefined(bool defined, int id, int map_id = 0) const;
int CountElementsWithCondition(std::function<bool(const V)> op, int id, int map_id = 0) const;

Expand Down Expand Up @@ -369,11 +372,14 @@ class Game_DataStorage : public Game_DataStorageBase<T, V, storage_mode> {
mutable int _warnings = kMaxWarnings;
private:
/* DynamicScoped-only methods (hidden & only accessible through members of type 'dyn_scoped_facade_t' */
SCOPED_DYN_ONLY bool scopedGetIsDefined(int id, int map_id, int event_id = 0) const;
SCOPED_DYN_ONLY bool scopedGetIsReadOnly(int id, int map_id, int event_id = 0) const;
SCOPED_DYN_ONLY bool scopedGetIsDefaultValueDefined(int id, int map_id, int event_id = 0) const;
SCOPED_DYN_ONLY bool scopedGetIsAutoReset(int id, int map_id, int event_id = 0) const;
SCOPED_DYN_ONLY bool scopedGetIsInheritedValue(int id, int map_id) const;
SCOPED_DYN_ONLY bool scopedIsStorageInitialized(int map_id, int event_id = 0) const;
template<DataScopeType, typename F>
bool scopedGetInherited(int id, int map_id, F&& get_parent_id, V& out_val) const;
SCOPED_DYN_ONLY bool scopedIsDefined(int id, int map_id, int event_id = 0) const;
SCOPED_DYN_ONLY bool scopedIsReadOnly(int id, int map_id, int event_id = 0) const;
SCOPED_DYN_ONLY bool scopedIsDefaultValueDefined(int id, int map_id, int event_id = 0) const;
SCOPED_DYN_ONLY bool scopedIsAutoReset(int id, int map_id, int event_id = 0) const;
SCOPED_DYN_ONLY bool scopedIsInheritedValue(int id, int map_id) const;
SCOPED_DYN_ONLY int scopedCountElementsDefined(bool defined, int id, int map_id = 0) const;
SCOPED_DYN_ONLY int scopedCountElementsWithCondition(std::function<bool(const V)> op, int id, int map_id = 0) const;

Expand Down Expand Up @@ -421,13 +427,13 @@ inline void Game_VectorDataStorageBase<T, V>::SetLowerLimit(size_t limit) {
if (limit > DynamicScope::scopedvar_maps_max_count) {
Output::Debug("Invalid limit for Scope 'Map': {}", limit);
}
_limits[static_cast<int>(S)] = std::max(limit, DynamicScope::scopedvar_maps_max_count);
_limits[static_cast<int>(S)] = std::min(limit, DynamicScope::scopedvar_maps_max_count);
}
if constexpr (DynamicScope::IsMapEventScope(S)) {
if (limit > DynamicScope::scopedvar_maps_max_count) {
Output::Debug("Invalid limit for Scope 'MapEvent': {}", limit);
}
_limits[static_cast<int>(S)] = std::max(limit, DynamicScope::scopedvar_mapevents_max_count);
_limits[static_cast<int>(S)] = std::min(limit, DynamicScope::scopedvar_mapevents_max_count);
}
}

Expand Down Expand Up @@ -582,7 +588,7 @@ template <typename T, typename V, VarStorage::DataStorageMode storage_mode>
template<DataScopeType S>
inline bool Game_DataStorage<T, V, storage_mode>::scopedValidateReadOnly(int first_id, int last_id, int map_id, int event_id) const {
if (first_id == last_id) {
if (scopedGetIsReadOnly<S>(first_id, map_id, event_id)) {
if (scopedIsReadOnly<S>(first_id, map_id, event_id)) {
Output::Debug("Invalid write to {}! (Set as Read-Only)", this->FormatLValue<S>(first_id, 0, map_id, event_id));
return false;
}
Expand All @@ -591,7 +597,7 @@ inline bool Game_DataStorage<T, V, storage_mode>::scopedValidateReadOnly(int fir
std::swap(first_id, last_id);
}
for (int id = first_id; id <= last_id; id++) {
if (scopedGetIsReadOnly<S>(id, map_id, event_id)) {
if (scopedIsReadOnly<S>(id, map_id, event_id)) {
Output::Debug("Invalid write to {}! ('{}' is set as Read-Only)", this->FormatLValue<S>(first_id, last_id, map_id, event_id), id);
return false;
}
Expand Down Expand Up @@ -634,15 +640,6 @@ inline DynamicScope::ScopedDataStorage<typename Game_DataStorageBase<T, V, stora
storage.valid = true;
storage.map_id = map_id;
storage.evt_id = event_id;
if constexpr (storage_mode == VarStorage::eStorageMode_Vector) {
storage.data.prepare(1, static_cast<int>(GetLimit<S>()));

for (int i = 0; i < GetLimit<S>(); i++) {
storage.flags[i] = scopedInitFlags(S, i);
}
} else {
//TODO
}

_scopedData[hash] = storage;

Expand Down Expand Up @@ -787,10 +784,7 @@ inline V Game_DataStorage<T, V, storage_mode>::PerformOperation(int id, V value,
return scopedGetDefaultValue(S, id);
}
auto& storage = GetScopedStorageForEdit<S>(true, args...);
if constexpr (storage_mode == VarStorage::eStorageMode_Vector) {
storage.data.prepare(id, std::max(id, static_cast<int>(GetLimit<S>())));
//TODO !!!! consider init flags set in .ldb (libclf "ScopedSwitch", "ScopedVariable", Validate size
}
PrepareRange<S>(id, id, args...);

storage.flags[id - 1] |= ScopedDataStorage_t::eFlag_ValueDefined;

Expand All @@ -807,6 +801,28 @@ inline V Game_DataStorage<T, V, storage_mode>::PerformOperation(int id, V value,
}
}

// TODO: explicitly declare in header & move to .cpp?
template <typename T, typename V, VarStorage::DataStorageMode storage_mode>
template<DataScopeType S, typename F>
bool Game_DataStorage<T, V, storage_mode>::scopedGetInherited(int id, int map_id, F&& get_parent_id, V& out_val) const {
ASSERT_IS_MAP_SCOPE(S, "scopedGetInherited");

bool defined = scopedIsDefined<S>(id, map_id);
if (!defined) {
int parent_map_id = get_parent_id(map_id);
if (map_id == parent_map_id) {
Output::Error("Invalid parent lookup for {}!", FormatLValue<S>(id, id, map_id, 0));
return false;
}
if (parent_map_id <= 0)
return false;

return scopedGetInherited<S>(id, parent_map_id, get_parent_id, out_val);
}
out_val = Get<S>(id, map_id);
return true;
}

template <typename T, typename V, VarStorage::DataStorageMode storage_mode>
template <DataScopeType S, typename F_V, typename F_OP, typename... Args>
void Game_DataStorage<T, V, storage_mode>::WriteRange(const int first_id, const int last_id, F_V&& value, F_OP&& op, Args... args) {
Expand Down Expand Up @@ -870,6 +886,20 @@ inline void Game_DataStorage<T, V, storage_mode>::IdsFromHash(uint32_t hash, Dat

/* Facade implementation for DynamicScoped-only methods */

template <typename T, typename V, VarStorage::DataStorageMode storage_mode>
template<DataScopeType S>
inline bool Game_DataStorage<T, V, storage_mode>::dyn_scoped_facade_t<S>::IsStorageInitialized(int map_id, int event_id) const {
return _parent.scopedIsStorageInitialized<S>(map_id, event_id);
}


template <typename T, typename V, VarStorage::DataStorageMode storage_mode>
template<DataScopeType S>
template<typename F>
inline bool Game_DataStorage<T, V, storage_mode>::dyn_scoped_facade_t<S>::GetInherited(int id, int map_id, F&& get_parent_id, V& out_val) const {
return _parent.scopedGetInherited<S>(id, map_id, get_parent_id, out_val);
}

template <typename T, typename V, VarStorage::DataStorageMode storage_mode>
template <DataScopeType S>
inline V Game_DataStorage<T, V, storage_mode>::dyn_scoped_facade_t<S>::GetDefaultValue(int id) const {
Expand All @@ -878,32 +908,32 @@ inline V Game_DataStorage<T, V, storage_mode>::dyn_scoped_facade_t<S>::GetDefaul

template <typename T, typename V, VarStorage::DataStorageMode storage_mode>
template <DataScopeType S>
inline bool Game_DataStorage<T, V, storage_mode>::dyn_scoped_facade_t<S>::GetIsDefined(int id, int map_id, int event_id) const {
return _parent.scopedGetIsDefined<S>(id, map_id, event_id);
inline bool Game_DataStorage<T, V, storage_mode>::dyn_scoped_facade_t<S>::IsDefined(int id, int map_id, int event_id) const {
return _parent.scopedIsDefined<S>(id, map_id, event_id);
}

template <typename T, typename V, VarStorage::DataStorageMode storage_mode>
template <DataScopeType S>
inline bool Game_DataStorage<T, V, storage_mode>::dyn_scoped_facade_t<S>::GetIsReadOnly(int id, int map_id, int event_id) const {
return _parent.scopedGetIsReadOnly<S>(id, map_id, event_id);
inline bool Game_DataStorage<T, V, storage_mode>::dyn_scoped_facade_t<S>::IsReadOnly(int id, int map_id, int event_id) const {
return _parent.scopedIsReadOnly<S>(id, map_id, event_id);
}

template <typename T, typename V, VarStorage::DataStorageMode storage_mode>
template <DataScopeType S>
inline bool Game_DataStorage<T, V, storage_mode>::dyn_scoped_facade_t<S>::GetIsAutoReset(int id, int map_id, int event_id) const {
return _parent.scopedGetIsAutoReset<S>(id, map_id, event_id);
inline bool Game_DataStorage<T, V, storage_mode>::dyn_scoped_facade_t<S>::IsAutoReset(int id, int map_id, int event_id) const {
return _parent.scopedIsAutoReset<S>(id, map_id, event_id);
}

template <typename T, typename V, VarStorage::DataStorageMode storage_mode>
template <DataScopeType S>
inline bool Game_DataStorage<T, V, storage_mode>::dyn_scoped_facade_t<S>::GetIsDefaultValueDefined(int id, int map_id, int event_id) const {
return _parent.scopedGetIsDefaultValueDefined<S>(id, map_id, event_id);
inline bool Game_DataStorage<T, V, storage_mode>::dyn_scoped_facade_t<S>::IsDefaultValueDefined(int id, int map_id, int event_id) const {
return _parent.scopedIsDefaultValueDefined<S>(id, map_id, event_id);
}

template <typename T, typename V, VarStorage::DataStorageMode storage_mode>
template <DataScopeType S>
inline bool Game_DataStorage<T, V, storage_mode>::dyn_scoped_facade_t<S>::GetIsInheritedValue(int id, int map_id) const {
return _parent.scopedGetIsInheritedValue<S>(id, map_id);
inline bool Game_DataStorage<T, V, storage_mode>::dyn_scoped_facade_t<S>::IsInheritedValue(int id, int map_id) const {
return _parent.scopedIsInheritedValue<S>(id, map_id);
}

template <typename T, typename V, VarStorage::DataStorageMode storage_mode>
Expand Down Expand Up @@ -969,8 +999,11 @@ SCOPED_FUNC_EXPLICIT_IMPL_FUNC(void, T, V, mode, SetRange, int COMMA int COMMA V
SCOPED_FUNC_EXPLICIT_IMPL_FUNC(void, T, V, mode, PrepareRange, const int COMMA const int) \
VARSCOPED_FUNC_EXPLICIT_IMPL_FUNC(void, T, V, mode, scopedResetTemporaryData, int COMMA int) \
VARSCOPED_FUNC_EXPLICIT_IMPL_FUNC(void, T, V, mode, scopedSetResetFlagForId, int COMMA bool COMMA int COMMA int) \
VARSCOPED_FUNC_EXPLICIT_IMPL_FUNC_CONST(bool, T, V, mode, scopedGetIsDefined, int COMMA int COMMA int) \
VARSCOPED_FUNC_EXPLICIT_IMPL_FUNC_CONST(bool, T, V, mode, scopedGetIsInheritedValue, int COMMA int) \
VARSCOPED_FUNC_EXPLICIT_IMPL_FUNC_CONST(bool, T, V, mode, scopedIsStorageInitialized, int COMMA int) \
VARSCOPED_FUNC_EXPLICIT_IMPL_FUNC_CONST(bool, T, V, mode, scopedIsDefined, int COMMA int COMMA int) \
VARSCOPED_FUNC_EXPLICIT_IMPL_FUNC_CONST(bool, T, V, mode, scopedIsAutoReset, int COMMA int COMMA int) \
VARSCOPED_FUNC_EXPLICIT_IMPL_FUNC_CONST(bool, T, V, mode, scopedIsDefaultValueDefined, int COMMA int COMMA int) \
VARSCOPED_FUNC_EXPLICIT_IMPL_FUNC_CONST(bool, T, V, mode, scopedIsInheritedValue, int COMMA int) \
VARSCOPED_FUNC_EXPLICIT_IMPL_FUNC_CONST(int, T, V, mode, scopedCountElementsDefined, bool COMMA int COMMA int) \
VARSCOPED_FUNC_EXPLICIT_IMPL_FUNC_CONST(int, T, V, mode, scopedCountElementsWithCondition, std::function<bool(const V)> op COMMA int COMMA int) \
VARSCOPED_FUNC_EXPLICIT_IMPL_FUNC_CONST(std::vector<std::tuple<int COMMA int>>, T, V, mode, scopedGetElementsDefined, bool COMMA int COMMA int COMMA int) \
Expand Down
Loading

0 comments on commit e7a04ac

Please sign in to comment.