add asserts.
This commit is contained in:
parent
4953d4988d
commit
977e878eff
@ -4,6 +4,15 @@ project(dropshell VERSION 1.0.0 LANGUAGES CXX)
|
|||||||
set(CMAKE_CXX_STANDARD 17)
|
set(CMAKE_CXX_STANDARD 17)
|
||||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
|
||||||
|
# Set default build type to Release if not specified
|
||||||
|
if(NOT CMAKE_BUILD_TYPE)
|
||||||
|
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build (Debug or Release)" FORCE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Configure build-specific compiler flags
|
||||||
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g")
|
||||||
|
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -DNDEBUG")
|
||||||
|
|
||||||
# Configure version information
|
# Configure version information
|
||||||
string(TIMESTAMP CURRENT_YEAR "%Y")
|
string(TIMESTAMP CURRENT_YEAR "%Y")
|
||||||
string(TIMESTAMP CURRENT_MONTH "%m")
|
string(TIMESTAMP CURRENT_MONTH "%m")
|
||||||
|
2
build.sh
2
build.sh
@ -74,7 +74,7 @@ fi
|
|||||||
|
|
||||||
# Configure with CMake
|
# Configure with CMake
|
||||||
print_status "Configuring with CMake..."
|
print_status "Configuring with CMake..."
|
||||||
cmake .. -DCMAKE_BUILD_TYPE=Release
|
cmake .. -DCMAKE_BUILD_TYPE=Debug
|
||||||
|
|
||||||
# Build the project
|
# Build the project
|
||||||
print_status "Building project..."
|
print_status "Building project..."
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
#include "templates.hpp"
|
#include "templates.hpp"
|
||||||
#include "services.hpp"
|
#include "services.hpp"
|
||||||
#include "servers.hpp"
|
#include "servers.hpp"
|
||||||
|
#include "utils/assert.hpp"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
@ -22,6 +23,7 @@ void dropshell::autocomplete(const std::vector<std::string> &args)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ASSERT(args.size() >= 3);
|
||||||
std::string cmd = args[2];
|
std::string cmd = args[2];
|
||||||
|
|
||||||
// std::cout<<" cmd = ["<<cmd<<"]"<<std::endl;
|
// std::cout<<" cmd = ["<<cmd<<"]"<<std::endl;
|
||||||
|
81
src/utils/assert.hpp
Normal file
81
src/utils/assert.hpp
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
#ifndef DROPSHELL_ASSERT_HPP
|
||||||
|
#define DROPSHELL_ASSERT_HPP
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <string_view>
|
||||||
|
#include <cstdlib> // For std::exit and EXIT_FAILURE
|
||||||
|
|
||||||
|
namespace ds {
|
||||||
|
|
||||||
|
struct SourceLocation {
|
||||||
|
const char* file_name;
|
||||||
|
int line;
|
||||||
|
const char* function_name;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Helper macro to create a SourceLocation with current context
|
||||||
|
#define DS_CURRENT_LOCATION ds::SourceLocation{__FILE__, __LINE__, __func__}
|
||||||
|
|
||||||
|
[[noreturn]] inline void assert_fail(
|
||||||
|
const char* expression,
|
||||||
|
const SourceLocation& location,
|
||||||
|
const char* message = nullptr) {
|
||||||
|
|
||||||
|
std::cerr << "\033[1;31mAssertion failed!\033[0m\n"
|
||||||
|
<< "Expression: \033[1;33m" << expression << "\033[0m\n"
|
||||||
|
<< "Location: \033[1;36m" << location.file_name << ":"
|
||||||
|
<< location.line << "\033[0m\n"
|
||||||
|
<< "Function: \033[1;36m" << location.function_name << "\033[0m\n";
|
||||||
|
|
||||||
|
if (message) {
|
||||||
|
std::cerr << "Message: \033[1;37m" << message << "\033[0m\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cerr << std::endl;
|
||||||
|
|
||||||
|
// Exit the program without creating a core dump
|
||||||
|
std::exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace ds
|
||||||
|
|
||||||
|
// Define assertion macros with different behaviors based on build configuration
|
||||||
|
#if defined(NDEBUG) && !defined(DS_ENABLE_RELEASE_ASSERTS)
|
||||||
|
// Assertions disabled in release builds by default
|
||||||
|
#define ASSERT(condition) ((void)0)
|
||||||
|
#define ASSERT_MSG(condition, message) ((void)0)
|
||||||
|
#else
|
||||||
|
// Standard assertion
|
||||||
|
#define ASSERT(condition) \
|
||||||
|
do { \
|
||||||
|
if (!(condition)) { \
|
||||||
|
ds::assert_fail(#condition, DS_CURRENT_LOCATION); \
|
||||||
|
} \
|
||||||
|
} while (false)
|
||||||
|
|
||||||
|
// Assertion with custom message
|
||||||
|
#define ASSERT_MSG(condition, message) \
|
||||||
|
do { \
|
||||||
|
if (!(condition)) { \
|
||||||
|
ds::assert_fail(#condition, DS_CURRENT_LOCATION, message); \
|
||||||
|
} \
|
||||||
|
} while (false)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Always-active assertion for critical checks, even in release builds
|
||||||
|
#define ASSERT_ALWAYS(condition) \
|
||||||
|
do { \
|
||||||
|
if (!(condition)) { \
|
||||||
|
ds::assert_fail(#condition, DS_CURRENT_LOCATION); \
|
||||||
|
} \
|
||||||
|
} while (false)
|
||||||
|
|
||||||
|
// Always-active assertion with custom message for critical checks
|
||||||
|
#define ASSERT_ALWAYS_MSG(condition, message) \
|
||||||
|
do { \
|
||||||
|
if (!(condition)) { \
|
||||||
|
ds::assert_fail(#condition, DS_CURRENT_LOCATION, message); \
|
||||||
|
} \
|
||||||
|
} while (false)
|
||||||
|
|
||||||
|
#endif // DROPSHELL_ASSERT_HPP
|
Loading…
x
Reference in New Issue
Block a user