Common macros definitions in utils.hpp 41/160141/9
authorPawel Kurowski <p.kurowski2@samsung.com>
Tue, 14 Nov 2017 13:43:07 +0000 (14:43 +0100)
committerLukasz Oleksak <l.oleksak@samsung.com>
Wed, 15 Nov 2017 13:51:38 +0000 (13:51 +0000)
PRINT_ERROR_IF
RETURN_IF
RETURN_DEFAULT_IF

Change-Id: Ibd904bd39d2d900e00c0b0b9f6264148d346a948

src/AppControlActivity.cpp
src/Atspi.cpp
src/VolumeControlActivity.cpp
src/utils.hpp

index 851f18f..f9cf3ae 100644 (file)
 #include "Activity.hpp"
 #include "UniversalSwitchLog.hpp"
 #include "ActivityFactory.hpp"
-#include <app.h>
-
-#define CHECK_ERROR(ret) do {                                                  \
-               if (ret != APP_CONTROL_ERROR_NONE) {                    \
-                       DEBUG("app_control failed. err = %d", ret);     \
-               }                                                                                               \
-       } while (false)
+#include "utils.hpp"
 
-#define RETURN_ON_ERROR(ret) do {                                              \
-               if (ret != APP_CONTROL_ERROR_NONE) {                    \
-                       CHECK_ERROR(ret);                                                       \
-                       markAsCompleted();                                                      \
-                       return;                                                                         \
-               }                                                                                               \
-       } while (false)
+#include <app.h>
 
 template <typename DerivedType, bool bindable>
 class AppControlActivity : public Activity, private RegisterActivity<DerivedType, bindable>
@@ -45,37 +33,43 @@ public:
        ~AppControlActivity()
        {
                if (appControlHandle) {
-                       auto ret = app_control_destroy(appControlHandle);
-                       CHECK_ERROR(ret);
+                       auto status = app_control_destroy(appControlHandle);
+                       PRINT_ERROR_IF(status != APP_CONTROL_ERROR_NONE);
                }
        }
 
        void process() override
        {
-               auto ret = app_control_create(&appControlHandle);
-               RETURN_ON_ERROR(ret);
-
-               ret = app_control_set_operation(appControlHandle, APP_CONTROL_OPERATION_DEFAULT);
-               RETURN_ON_ERROR(ret);
-
-               ret = app_control_set_app_id(appControlHandle, DerivedType::appToLaunch);
-               RETURN_ON_ERROR(ret);
-
-               ret = addExtraDataToCall();
-               RETURN_ON_ERROR(ret);
-
-               ret = app_control_send_launch_request(appControlHandle, NULL, NULL);
-               RETURN_ON_ERROR(ret);
-
+               launch();
                markAsCompleted();
        }
+
 protected:
-       virtual int addExtraDataToCall()
+       app_control_h appControlHandle;
+
+private:
+       int addExtraDataToCall()
        {
                return APP_CONTROL_ERROR_NONE;
        }
 
-       app_control_h appControlHandle;
+       void launch()
+       {
+               auto status = app_control_create(&appControlHandle);
+               RETURN_IF(status != APP_CONTROL_ERROR_NONE);
+
+               status = app_control_set_operation(appControlHandle, APP_CONTROL_OPERATION_DEFAULT);
+               RETURN_IF(status != APP_CONTROL_ERROR_NONE);
+
+               status = app_control_set_app_id(appControlHandle, DerivedType::appToLaunch);
+               RETURN_IF(status != APP_CONTROL_ERROR_NONE);
+
+               status = static_cast<DerivedType *>(this)->addExtraDataToCall();
+               RETURN_IF(status != APP_CONTROL_ERROR_NONE);
+
+               status = app_control_send_launch_request(appControlHandle, NULL, NULL);
+               PRINT_ERROR_IF(status != APP_CONTROL_ERROR_NONE);
+       }
 };
 
 class StartHomeScreenActivity : public AppControlActivity<StartHomeScreenActivity, true>
@@ -102,11 +96,14 @@ public:
 class StartSettingsActivity : public AppControlActivity<StartSettingsActivity, false>
 {
 public:
-       int addExtraDataToCall() override
-       {
-               return app_control_add_extra_data(appControlHandle, "SHOW_US_SETTINGS", "1");
-       }
+       friend AppControlActivity<StartSettingsActivity, false>;
 
        static constexpr const char *activityType = "START_SETTINGS";
        static constexpr const char *appToLaunch = "org.tizen.setting-accessibility";
+
+protected:
+       int addExtraDataToCall()
+       {
+               return app_control_add_extra_data(appControlHandle, "SHOW_US_SETTINGS", "1");
+       }
 };
index 259c0f6..cfeefef 100644 (file)
@@ -17,6 +17,8 @@
 #include "Atspi.hpp"
 #include "Singleton.hpp"
 #include "dbusLocators.hpp"
+#include "utils.hpp"
+
 #include <memory>
 #include <functional>
 #include <limits>
@@ -31,28 +33,12 @@ using namespace DBus;
                } \
        } while (0)
 
-#define RETURN_EMPTY_ON_NULLPTR(obj) \
-       do { \
-               if (!obj) { \
-                       ERROR("nullptr passed as critical argument"); \
-                       return {}; \
-               } \
-       } while (0)
-
-#define RETURN_ON_NULLPTR(obj) \
-       do { \
-               if (!obj) { \
-                       DEBUG("nullptr passed as critical argument"); \
-                       return; \
-               } \
-       } while (0)
-
 namespace
 {
        template<class ReturnType, class GetValueFunctionType, class InterfaceType>
        Optional<ReturnType> getValueTemplateFunction(GetValueFunctionType getValueFunction, InterfaceType interface)
        {
-               RETURN_EMPTY_ON_NULLPTR(interface);
+               RETURN_DEFAULT_IF(!interface);
                GError *error = nullptr;
                ReturnType value = getValueFunction(interface, &error);
                if (error) {
@@ -364,7 +350,7 @@ Optional<unsigned int> Atspi::getProcessId(const AtspiAccessiblePtr &accessibleO
 
 AtspiAccessiblePtr Atspi::getObjectInRelation(const AtspiAccessiblePtr &accessibleObj, AtspiRelationType searchType) const
 {
-       RETURN_EMPTY_ON_NULLPTR(accessibleObj);
+       RETURN_DEFAULT_IF(!accessibleObj);
        GError *error = nullptr;
        auto relations = atspi_accessible_get_relation_set(accessibleObj.get(), &error);
        PRINT_ERROR_AND_FREE(error);
@@ -940,7 +926,7 @@ void Atspi::getAtPoint(Point pt, CoordType type, const AtspiAccessiblePtr &root,
 
 std::vector<std::pair<std::string, std::string>> Atspi::getAttributes(const AtspiAccessiblePtr &accessibleObj) const
 {
-       RETURN_EMPTY_ON_NULLPTR(accessibleObj);
+       RETURN_DEFAULT_IF(!accessibleObj);
        GError *error = nullptr;
        GHashTable *attr = atspi_accessible_get_attributes(accessibleObj.get(), nullptr);
        PRINT_ERROR_AND_FREE(error);
@@ -964,7 +950,7 @@ std::vector<std::pair<std::string, std::string>> Atspi::getAttributes(const Atsp
 
 AtspiActionPtr Atspi::getActionInterface(const AtspiAccessiblePtr &accessibleObj) const
 {
-       RETURN_EMPTY_ON_NULLPTR(accessibleObj);
+       RETURN_DEFAULT_IF(!accessibleObj);
        auto action = atspi_accessible_get_action_iface(accessibleObj.get());
        if (!action)
                DEBUG("Action interface is not available");
@@ -973,7 +959,7 @@ AtspiActionPtr Atspi::getActionInterface(const AtspiAccessiblePtr &accessibleObj
 
 bool Atspi::doAction(const AtspiActionPtr &accessibleObj, int action) const
 {
-       RETURN_EMPTY_ON_NULLPTR(accessibleObj);
+       RETURN_DEFAULT_IF(!accessibleObj);
        GError *error = nullptr;
        auto status = atspi_action_do_action(accessibleObj.get(), action, &error);
        PRINT_ERROR_AND_FREE(error);
@@ -986,7 +972,7 @@ bool Atspi::doAction(const AtspiActionPtr &accessibleObj, int action) const
 
 bool Atspi::doActionName(const AtspiActionPtr &accessibleObj, const std::string &action) const
 {
-       RETURN_EMPTY_ON_NULLPTR(accessibleObj);
+       RETURN_DEFAULT_IF(!accessibleObj);
        GError *error = nullptr;
        auto status = atspi_action_do_action_name(accessibleObj.get(), action.c_str(), &error);
        PRINT_ERROR_AND_FREE(error);
@@ -999,7 +985,7 @@ bool Atspi::doActionName(const AtspiActionPtr &accessibleObj, const std::string
 
 Optional<size_t> Atspi::getActionCount(const AtspiActionPtr &accessibleObj) const
 {
-       RETURN_EMPTY_ON_NULLPTR(accessibleObj);
+       RETURN_DEFAULT_IF(!accessibleObj);
        GError *error = nullptr;
        auto res = atspi_action_get_n_actions(accessibleObj.get(), &error);
        PRINT_ERROR_AND_FREE(error);
@@ -1012,7 +998,7 @@ Optional<size_t> Atspi::getActionCount(const AtspiActionPtr &accessibleObj) cons
 
 Optional<std::string> Atspi::getActionName(const AtspiActionPtr &accessibleObj, size_t num) const
 {
-       RETURN_EMPTY_ON_NULLPTR(accessibleObj);
+       RETURN_DEFAULT_IF(!accessibleObj);
        GError *error = nullptr;
        auto res = atspi_action_get_action_name(accessibleObj.get(), (int)num, &error);
        PRINT_ERROR_AND_FREE(error);
@@ -1027,7 +1013,7 @@ Optional<std::string> Atspi::getActionName(const AtspiActionPtr &accessibleObj,
 
 AtspiCollectionPtr Atspi::getCollectionInterface(const AtspiAccessiblePtr &accessibleObj) const
 {
-       RETURN_EMPTY_ON_NULLPTR(accessibleObj);
+       RETURN_DEFAULT_IF(!accessibleObj);
        auto collectionInterface = atspi_accessible_get_collection_iface(accessibleObj.get());
        if (!collectionInterface)
                DEBUG("Object %p do not has collection interface", accessibleObj.get());
@@ -1036,7 +1022,7 @@ AtspiCollectionPtr Atspi::getCollectionInterface(const AtspiAccessiblePtr &acces
 
 AtspiValuePtr Atspi::getValueInterface(const AtspiAccessiblePtr &accessibleObj) const
 {
-       RETURN_EMPTY_ON_NULLPTR(accessibleObj);
+       RETURN_DEFAULT_IF(!accessibleObj);
        auto valueInterface = atspi_accessible_get_value_iface(accessibleObj.get());
        if (!valueInterface)
                DEBUG("Object %p do not has value interface", accessibleObj.get());
@@ -1045,7 +1031,7 @@ AtspiValuePtr Atspi::getValueInterface(const AtspiAccessiblePtr &accessibleObj)
 
 AtspiTextPtr Atspi::getTextInterface(const AtspiAccessiblePtr &accessibleObj) const
 {
-       RETURN_EMPTY_ON_NULLPTR(accessibleObj);
+       RETURN_DEFAULT_IF(!accessibleObj);
        auto textInterface = atspi_accessible_get_text_iface(accessibleObj.get());
        if (!textInterface)
                DEBUG("Object %p do not has text interface", accessibleObj.get());
@@ -1054,7 +1040,7 @@ AtspiTextPtr Atspi::getTextInterface(const AtspiAccessiblePtr &accessibleObj) co
 
 AtspiEditableTextPtr Atspi::getEditableTextInterface(const AtspiAccessiblePtr &accessibleObj) const
 {
-       RETURN_EMPTY_ON_NULLPTR(accessibleObj);
+       RETURN_DEFAULT_IF(!accessibleObj);
        auto editableTextInterface = atspi_accessible_get_editable_text_iface(accessibleObj.get());
        if (!editableTextInterface)
                DEBUG("Object %p do not has editable text interface", accessibleObj.get());
@@ -1063,7 +1049,7 @@ AtspiEditableTextPtr Atspi::getEditableTextInterface(const AtspiAccessiblePtr &a
 
 Optional<TextRange> Atspi::getTextSelection(const AtspiTextPtr &textInterface, int selectionNum) const
 {
-       RETURN_EMPTY_ON_NULLPTR(textInterface);
+       RETURN_DEFAULT_IF(!textInterface);
        GError *error = nullptr;
        auto range = std::unique_ptr<AtspiRange, void(*)(void *)>(atspi_text_get_selection(textInterface.get(), selectionNum, &error), g_free);
        PRINT_ERROR_AND_FREE(error);
@@ -1093,7 +1079,7 @@ namespace   //TODO change when atspi_text_get_string_at_offset will be supported
 
 Optional<TextRange> Atspi::getTextRangeAtOffset(const AtspiTextPtr &textInterface, size_t offset, Granularity granularity) const
 {
-       RETURN_EMPTY_ON_NULLPTR(textInterface);
+       RETURN_DEFAULT_IF(!textInterface);
        GError *error = nullptr;
        auto range = std::unique_ptr<AtspiTextRange, void(*)(void *)>(
                                         //TODO change when atspi_text_get_string_at_offset will be supported by elementary
@@ -1107,7 +1093,7 @@ Optional<TextRange> Atspi::getTextRangeAtOffset(const AtspiTextPtr &textInterfac
 
 std::string Atspi::getTextAtOffset(const AtspiTextPtr &textInterface, size_t offset, Granularity granularity) const
 {
-       RETURN_EMPTY_ON_NULLPTR(textInterface);
+       RETURN_DEFAULT_IF(!textInterface);
        GError *error = nullptr;
        auto range = std::unique_ptr<AtspiTextRange, void(*)(void *)>(
                                         //TODO change when atspi_text_get_string_at_offset will be supported by elementary
@@ -1121,7 +1107,7 @@ std::string Atspi::getTextAtOffset(const AtspiTextPtr &textInterface, size_t off
 
 void Atspi::setTextSelection(const AtspiTextPtr &textInterface, TextRange range, int selectionNum) const
 {
-       RETURN_ON_NULLPTR(textInterface);
+       RETURN_IF(!textInterface);
        if (range.start > range.end) {
                ERROR("Incorrect range - start: %d, end: %d", range.start, range.end);
                return;
@@ -1136,7 +1122,7 @@ void Atspi::setTextSelection(const AtspiTextPtr &textInterface, TextRange range,
 
 void Atspi::removeTextSelection(const AtspiTextPtr &textInterface, int selectionNum) const
 {
-       RETURN_ON_NULLPTR(textInterface);
+       RETURN_IF(!textInterface);
        GError *error = nullptr;
        if (!atspi_text_remove_selection(textInterface.get(), selectionNum, &error))
                ERROR("atspi_text_remove_selection failed");
@@ -1145,7 +1131,7 @@ void Atspi::removeTextSelection(const AtspiTextPtr &textInterface, int selection
 
 Optional<size_t> Atspi::getTextCaretOffset(const AtspiTextPtr &textInterface) const
 {
-       RETURN_EMPTY_ON_NULLPTR(textInterface);
+       RETURN_DEFAULT_IF(!textInterface);
        GError *error = nullptr;
        auto offset = atspi_text_get_caret_offset(textInterface.get(), &error);
        Optional<size_t> ret;
@@ -1157,7 +1143,7 @@ Optional<size_t> Atspi::getTextCaretOffset(const AtspiTextPtr &textInterface) co
 
 void Atspi::setTextCaretOffset(const AtspiTextPtr &textInterface, size_t offset) const
 {
-       RETURN_ON_NULLPTR(textInterface);
+       RETURN_IF(!textInterface);
        GError *error = nullptr;
        if (!atspi_text_set_caret_offset(textInterface.get(), static_cast<int>(offset), &error))
                ERROR("atspi_text_set_selection failed");
@@ -1166,7 +1152,7 @@ void Atspi::setTextCaretOffset(const AtspiTextPtr &textInterface, size_t offset)
 
 Optional<size_t> Atspi::countTextCharacters(const AtspiTextPtr &textInterface) const
 {
-       RETURN_EMPTY_ON_NULLPTR(textInterface);
+       RETURN_DEFAULT_IF(!textInterface);
        GError *error = nullptr;
        auto count = atspi_text_get_character_count(textInterface.get(), &error);
        Optional<size_t> ret;
@@ -1178,7 +1164,7 @@ Optional<size_t> Atspi::countTextCharacters(const AtspiTextPtr &textInterface) c
 
 void Atspi::copyEditableText(const AtspiEditableTextPtr &editableTextInterface, TextRange range) const
 {
-       RETURN_ON_NULLPTR(editableTextInterface);
+       RETURN_IF(!editableTextInterface);
        if (range.start > range.end) {
                ERROR("Incorrect range - start: %d, end: %d", range.start, range.end);
                return;
@@ -1190,7 +1176,7 @@ void Atspi::copyEditableText(const AtspiEditableTextPtr &editableTextInterface,
 
 void Atspi::cutEditableText(const AtspiEditableTextPtr &editableTextInterface, TextRange range) const
 {
-       RETURN_ON_NULLPTR(editableTextInterface);
+       RETURN_IF(!editableTextInterface);
        if (range.start > range.end) {
                ERROR("Incorrect range - start: %d, end: %d", range.start, range.end);
                return;
@@ -1202,7 +1188,7 @@ void Atspi::cutEditableText(const AtspiEditableTextPtr &editableTextInterface, T
 
 void Atspi::pasteEditableText(const AtspiEditableTextPtr &editableTextInterface, size_t offset) const
 {
-       RETURN_ON_NULLPTR(editableTextInterface);
+       RETURN_IF(!editableTextInterface);
        GError *error = nullptr;
        atspi_editable_text_paste_text(editableTextInterface.get(), offset, &error);
        PRINT_ERROR_AND_FREE(error);
@@ -1215,7 +1201,7 @@ Optional<double> Atspi::getCurrentValue(const AtspiValuePtr &valueInterface) con
 
 bool Atspi::setCurrentValue(const AtspiValuePtr &valueInterface, double newValue) const
 {
-       RETURN_EMPTY_ON_NULLPTR(valueInterface);
+       RETURN_DEFAULT_IF(!valueInterface);
        GError *error = nullptr;
        auto isSuccessful = atspi_value_set_current_value(valueInterface.get(), newValue, &error);
        PRINT_ERROR_AND_FREE(error);
@@ -1305,7 +1291,7 @@ AtspiAccessiblePtr Atspi::getAtPoint(Point pt, CoordType type, AtspiAccessiblePt
 
 Optional<size_t> Atspi::getChildrenCount(const AtspiAccessiblePtr &accessibleObj) const
 {
-       RETURN_EMPTY_ON_NULLPTR(accessibleObj);
+       RETURN_DEFAULT_IF(!accessibleObj);
        GError *error = nullptr;
        auto count = atspi_accessible_get_child_count(accessibleObj.get(), &error);
        PRINT_ERROR_AND_FREE(error);
@@ -1315,7 +1301,7 @@ Optional<size_t> Atspi::getChildrenCount(const AtspiAccessiblePtr &accessibleObj
 
 AtspiAccessiblePtr Atspi::getChildAtIndex(const AtspiAccessiblePtr &accessibleObj, size_t index) const
 {
-       RETURN_EMPTY_ON_NULLPTR(accessibleObj);
+       RETURN_DEFAULT_IF(!accessibleObj);
        GError *error = nullptr;
        auto res = atspi_accessible_get_child_at_index(accessibleObj.get(), (gint)index, &error);
        PRINT_ERROR_AND_FREE(error);
@@ -1324,7 +1310,7 @@ AtspiAccessiblePtr Atspi::getChildAtIndex(const AtspiAccessiblePtr &accessibleOb
 
 Optional<std::vector<AtspiAccessiblePtr>> Atspi::getChildren(const AtspiAccessiblePtr &accessibleObj) const
 {
-       RETURN_EMPTY_ON_NULLPTR(accessibleObj);
+       RETURN_DEFAULT_IF(!accessibleObj);
        auto count = getChildrenCount(accessibleObj);
        if (!count) return {};
 
@@ -1352,7 +1338,7 @@ AtspiAccessiblePtr Atspi::make(const std::string &bus, const std::string &path)
 
 AtspiAccessiblePtr Atspi::getParent(const AtspiAccessiblePtr &accessibleObj) const
 {
-       RETURN_EMPTY_ON_NULLPTR(accessibleObj);
+       RETURN_DEFAULT_IF(!accessibleObj);
        GError *error = nullptr;
        auto v = atspi_accessible_get_parent(accessibleObj.get(), &error);
        PRINT_ERROR_AND_FREE(error);
@@ -1362,7 +1348,7 @@ AtspiAccessiblePtr Atspi::getParent(const AtspiAccessiblePtr &accessibleObj) con
 
 Optional<size_t> Atspi::getIndexInParent(const AtspiAccessiblePtr &accessibleObj) const
 {
-       RETURN_EMPTY_ON_NULLPTR(accessibleObj);
+       RETURN_DEFAULT_IF(!accessibleObj);
        GError *error = nullptr;
        auto v = atspi_accessible_get_index_in_parent(accessibleObj.get(), &error);
        PRINT_ERROR_AND_FREE(error);
@@ -1372,14 +1358,14 @@ Optional<size_t> Atspi::getIndexInParent(const AtspiAccessiblePtr &accessibleObj
 
 AtspiSelectionPtr Atspi::getSelectionInterface(const AtspiAccessiblePtr &accessibleObj) const
 {
-       RETURN_EMPTY_ON_NULLPTR(accessibleObj);
+       RETURN_DEFAULT_IF(!accessibleObj);
        auto res = atspi_accessible_get_selection_iface(accessibleObj.get());
        return {res, g_object_unref};
 }
 
 bool Atspi::selectChild(const AtspiSelectionPtr &accessibleObj, size_t index) const
 {
-       RETURN_EMPTY_ON_NULLPTR(accessibleObj);
+       RETURN_DEFAULT_IF(!accessibleObj);
        GError *error = nullptr;
        atspi_selection_select_child(accessibleObj.get(), (int)index, &error);
        bool isSuccessful = (error == nullptr);
index c3fbbe8..a6fdb79 100644 (file)
 
 #include <sound_manager.h>
 
-#define RETURN_ON_ERROR(status) do {                                   \
-               if (status != SOUND_MANAGER_ERROR_NONE) {               \
-                       ERROR("Sound manager error %d", status);        \
-                       markAsCompleted();                                                      \
-                       return;                                                                         \
-               }                                                                                               \
-       } while (false)
-
 #define RETURN_DEFAULT_SOUND_TYPE_ON_ERROR(status) do {                                                                \
                if (status != SOUND_MANAGER_ERROR_NONE) {                                                                       \
                        if (status == SOUND_MANAGER_ERROR_NO_PLAYING_SOUND)                                             \
@@ -50,17 +42,7 @@ public:
 
        void process() override
        {
-               int volume = 0;
-               int maxVolume = 0;
-               int minVolume = 0;
-               sound_type_e soundType = getSoundType();
-
-               RETURN_ON_ERROR(sound_manager_get_max_volume(soundType, &maxVolume));
-               RETURN_ON_ERROR(sound_manager_get_volume(soundType, &volume));
-
-               volume = utils::clamp(volume + DerivedType::step, minVolume, maxVolume);
-               RETURN_ON_ERROR(sound_manager_set_volume(soundType, volume));
-
+               setVolume();
                markAsCompleted();
        }
 
@@ -69,6 +51,25 @@ public:
                return DerivedType::soundType;
        }
 
+private:
+       void setVolume()
+       {
+               auto volume = 0;
+               auto maxVolume = 0;
+               auto minVolume = 0;
+               auto soundType = getSoundType();
+
+               auto status = sound_manager_get_max_volume(soundType, &maxVolume);
+               RETURN_IF(status != SOUND_MANAGER_ERROR_NONE);
+
+               status = sound_manager_get_volume(soundType, &volume);
+               RETURN_IF(status != SOUND_MANAGER_ERROR_NONE);
+
+               volume = utils::clamp(volume + DerivedType::step, minVolume, maxVolume);
+
+               status = sound_manager_set_volume(soundType, volume);
+               PRINT_ERROR_IF(status != SOUND_MANAGER_ERROR_NONE);
+       }
 };
 
 
@@ -148,4 +149,4 @@ public:
        static constexpr const char *activityType = "DECREASE_VOLUME";
        static constexpr const int step = -1;
        static constexpr const sound_type_e soundType = SOUND_TYPE_RINGTONE;
-};
\ No newline at end of file
+};
index a837b3c..ef12ce6 100644 (file)
 
 #include <string>
 
+#define PRINT_ERROR_IF(condition) \
+       do { \
+               if (condition) \
+                       ERROR("Function failed"); \
+       } while (0)
+
+#define RETURN_IF(condition) \
+       do { \
+               if (condition) { \
+                       ERROR("Function failed, return"); \
+                       return; \
+               } \
+       } while (0)
+
+#define RETURN_DEFAULT_IF(condition) \
+       do { \
+               if (condition) { \
+                       ERROR("Function failed, return default"); \
+                       return {}; \
+               } \
+       } while (0)
+
 namespace utils
 {
        // TODO it would be removed when c++17 came