try use boost.stackstrace print exception call stack.
This commit is contained in:
parent
88bc6c11a1
commit
264ac80d2b
2
.vscode/c_cpp_properties.json
vendored
2
.vscode/c_cpp_properties.json
vendored
@ -4,7 +4,7 @@
|
||||
"name": "Linux",
|
||||
"includePath": [
|
||||
"${workspaceFolder}/**",
|
||||
"/opt/Libraries/boost_1_84_0/include"
|
||||
"/opt/Libraries/boost_1_85_0/include"
|
||||
],
|
||||
"defines": [],
|
||||
"compilerPath": "/usr/bin/gcc",
|
||||
|
@ -3,7 +3,6 @@ add_library(DataStructure
|
||||
ArrayList.h
|
||||
BinaryTree.h
|
||||
BinarySearchTree.h
|
||||
CircularDoublyLinkedList.h
|
||||
CircularLinkedList.h
|
||||
DoublyLinkedList.h
|
||||
DynamicArray.h
|
||||
|
@ -1,141 +0,0 @@
|
||||
#ifndef DUALCIRCULARLIST_H
|
||||
#define DUALCIRCULARLIST_H
|
||||
|
||||
#include "DoublyLinkedList.h"
|
||||
|
||||
namespace Kylin {
|
||||
template <typename T>
|
||||
class CircularDoublyLinkedList : public DoublyLinkedList<T> {
|
||||
using Node = typename DoublyLinkedList<T>::Node;
|
||||
using Iterator = typename DoublyLinkedList<T>::Iterator;
|
||||
|
||||
public:
|
||||
static constexpr size_t npos = static_cast<size_t>(-1);
|
||||
CircularDoublyLinkedList() {
|
||||
this->m_header.next = reinterpret_cast<Node *>(&(this->m_header));
|
||||
this->m_header.prev = reinterpret_cast<Node *>(&(this->m_header));
|
||||
this->m_last = reinterpret_cast<Node *>(&this->m_header);
|
||||
}
|
||||
|
||||
CircularDoublyLinkedList(std::initializer_list<T> init) {
|
||||
this->m_header.next = reinterpret_cast<Node *>(&(this->m_header));
|
||||
this->m_header.prev = reinterpret_cast<Node *>(&(this->m_header));
|
||||
this->m_last = reinterpret_cast<Node *>(&this->m_header);
|
||||
for (auto &value : init) append(value);
|
||||
}
|
||||
|
||||
CircularDoublyLinkedList(const CircularDoublyLinkedList &other) {
|
||||
this->m_header.next = reinterpret_cast<Node *>(&(this->m_header));
|
||||
this->m_header.prev = reinterpret_cast<Node *>(&(this->m_header));
|
||||
this->m_last = reinterpret_cast<Node *>(&this->m_header);
|
||||
|
||||
auto sourceNode = other.m_header.next;
|
||||
auto targetNode = reinterpret_cast<Node *>(&this->m_header);
|
||||
|
||||
for (size_t i = 0; i < other.m_size; i++) {
|
||||
auto newNode = this->create();
|
||||
if (newNode == nullptr) THROW_EXCEPTION(NoEnoughMemoryException, "No memory to create node ...");
|
||||
newNode->value = sourceNode->value;
|
||||
newNode->prev = targetNode;
|
||||
newNode->next = targetNode->next;
|
||||
|
||||
targetNode->next = newNode;
|
||||
targetNode = newNode;
|
||||
sourceNode = sourceNode->next;
|
||||
this->m_size++;
|
||||
this->m_last = targetNode;
|
||||
}
|
||||
}
|
||||
|
||||
CircularDoublyLinkedList(CircularDoublyLinkedList &&other) {
|
||||
this->m_size = other.m_size;
|
||||
this->m_header = other.m_header;
|
||||
this->m_last = other.m_last;
|
||||
|
||||
other.m_size = 0;
|
||||
other.m_header.next = nullptr;
|
||||
other.m_last = reinterpret_cast<Node *>(&other.m_header);
|
||||
}
|
||||
|
||||
void insert(size_t index, const T &value) override {
|
||||
index = index % (this->m_size + 1);
|
||||
if (index == this->m_size) return append(value);
|
||||
auto node = this->create();
|
||||
if (node == nullptr) THROW_EXCEPTION(NoEnoughMemoryException, "No momery to insert new element...");
|
||||
|
||||
node->value = value;
|
||||
|
||||
auto prev = position(index);
|
||||
auto next = prev->next;
|
||||
|
||||
node->next = next;
|
||||
node->prev = prev;
|
||||
|
||||
prev->next = node;
|
||||
next->prev = node;
|
||||
|
||||
this->m_size++;
|
||||
}
|
||||
|
||||
inline void append(const T &value) {
|
||||
auto node = this->create();
|
||||
if (node == nullptr) THROW_EXCEPTION(NoEnoughMemoryException, "No memory to create node ...");
|
||||
node->value = value;
|
||||
|
||||
node->prev = this->m_last;
|
||||
node->next = this->m_last->next;
|
||||
|
||||
this->m_last->next->prev = node;
|
||||
this->m_last->next = node;
|
||||
|
||||
this->m_last = node;
|
||||
this->m_size++;
|
||||
}
|
||||
|
||||
void removeAt(size_t index) override {
|
||||
index = mod(index);
|
||||
auto prev = position(index);
|
||||
auto toDel = prev->next;
|
||||
auto next = toDel->next;
|
||||
|
||||
prev->next = next;
|
||||
next->prev = prev;
|
||||
|
||||
this->destroy(toDel);
|
||||
|
||||
this->m_size--;
|
||||
}
|
||||
|
||||
T &last() override {
|
||||
if (this->m_size <= 0) THROW_EXCEPTION(InvalidOperationException, "There is no element in the container.");
|
||||
return this->m_header.prev->value;
|
||||
}
|
||||
|
||||
void clear() override {
|
||||
while (this->m_size > 0) {
|
||||
removeAt(0);
|
||||
}
|
||||
}
|
||||
Iterator end() override { return Iterator(reinterpret_cast<Node *>(&this->m_header)); }
|
||||
|
||||
Iterator end() const override { return Iterator(reinterpret_cast<Node *>(&this->m_header)); }
|
||||
|
||||
~CircularDoublyLinkedList() { clear(); }
|
||||
|
||||
T &operator[](size_t index) override {
|
||||
index = mod(index);
|
||||
return position(index)->next->value;
|
||||
}
|
||||
|
||||
protected:
|
||||
size_t mod(size_t index) const { return (this->m_size == 0) ? 0 : (index % this->m_size); }
|
||||
Node *position(size_t index) const override {
|
||||
auto node = reinterpret_cast<Node *>(&(this->m_header));
|
||||
for (size_t i = 0; i < index; i++) {
|
||||
node = node->next;
|
||||
}
|
||||
return node;
|
||||
}
|
||||
};
|
||||
} // namespace Kylin
|
||||
#endif // DUALCIRCULARLIST_H
|
@ -7,7 +7,6 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
add_executable(UnitTest main.cpp
|
||||
DataStructure/BinarySearchTreeTest.cpp
|
||||
DataStructure/BinaryTreeTest.cpp
|
||||
DataStructure/CircularDoublyLinkedListTest.cpp
|
||||
DataStructure/CircularLinkedListTest.cpp
|
||||
DataStructure/DoublyLinkedListTest.cpp
|
||||
DataStructure/DynamicArrayListTest.cpp
|
||||
|
@ -1,108 +0,0 @@
|
||||
#include "CircularDoublyLinkedList.h"
|
||||
#include <boost/test/unit_test.hpp>
|
||||
#include <iostream>
|
||||
|
||||
using namespace Kylin;
|
||||
|
||||
class CircularDoublyLinkedListTest {
|
||||
public:
|
||||
CircularDoublyLinkedList<size_t> list{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
|
||||
};
|
||||
|
||||
BOOST_AUTO_TEST_SUITE(CircularDoublyLinkedListTestCase)
|
||||
BOOST_FIXTURE_TEST_CASE(At, CircularDoublyLinkedListTest) { BOOST_CHECK_EQUAL(list.at(5), 5); }
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(Size, CircularDoublyLinkedListTest) { BOOST_CHECK_EQUAL(list.size(), 10); }
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(Last, CircularDoublyLinkedListTest) { BOOST_CHECK_EQUAL(list.last(), 9); }
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(EmptyListCallLastCauseException, CircularDoublyLinkedListTest) {
|
||||
CircularDoublyLinkedList<size_t> emptyList;
|
||||
BOOST_CHECK_THROW(emptyList.last(), InvalidOperationException);
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(CallLastAfterRemoveLastElement, CircularDoublyLinkedListTest) {
|
||||
list.removeAt(list.size() - 1);
|
||||
BOOST_CHECK_EQUAL(list.last(), 8);
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(RemoveIndexLessThenSize, CircularDoublyLinkedListTest) {
|
||||
list.removeAt(3);
|
||||
BOOST_CHECK_EQUAL(list[3], 4);
|
||||
BOOST_CHECK_EQUAL(list.length(), 9);
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(RemoveIndexBigThenSize, CircularDoublyLinkedListTest) {
|
||||
list.removeAt(15);
|
||||
BOOST_CHECK_EQUAL(list[5], 6);
|
||||
BOOST_CHECK_EQUAL(list.length(), 9);
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(Clear, CircularDoublyLinkedListTest) {
|
||||
list.clear();
|
||||
BOOST_CHECK_EQUAL(list.length(), 0);
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(IndexOf, CircularDoublyLinkedListTest) { BOOST_CHECK_EQUAL(list.indexOf(5), 5); }
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(Append, CircularDoublyLinkedListTest) {
|
||||
list.append(198);
|
||||
BOOST_CHECK_EQUAL(list.length(), 11);
|
||||
BOOST_CHECK_EQUAL(list.at(list.size() - 1), 198);
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(Swap, CircularDoublyLinkedListTest) {
|
||||
CircularDoublyLinkedList<size_t> list2;
|
||||
for (size_t i = 0; i < 5; i++) {
|
||||
list2.insert(list2.length(), i + 10);
|
||||
}
|
||||
|
||||
list2.swap(list);
|
||||
|
||||
BOOST_CHECK_EQUAL(list.size(), 5);
|
||||
BOOST_CHECK_EQUAL(list2.size(), 10);
|
||||
|
||||
for (size_t i = 0; i < 5; i++) {
|
||||
BOOST_CHECK_EQUAL(list.at(i), i + 10);
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < 10; i++) {
|
||||
BOOST_CHECK_EQUAL(list2.at(i), i);
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(InsertToIndexLessThenSize, CircularDoublyLinkedListTest) {
|
||||
list.insert(4, 456);
|
||||
BOOST_CHECK_EQUAL(list.length(), 11);
|
||||
BOOST_CHECK_EQUAL(list.at(4), 456);
|
||||
BOOST_CHECK_EQUAL(list.at(5), 4);
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(InsertToIndexEuqalSize, CircularDoublyLinkedListTest) {
|
||||
list.insert(list.size(), 456);
|
||||
BOOST_CHECK_EQUAL(list.length(), 11);
|
||||
BOOST_CHECK_EQUAL(list.at(list.size() - 1), 456);
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(CopyConstructor, CircularDoublyLinkedListTest) {
|
||||
auto list2(list);
|
||||
BOOST_CHECK_EQUAL(list2.size(), 10);
|
||||
list[9] = 2; //测试是否为浅拷贝
|
||||
BOOST_CHECK_EQUAL(list2[9], 9);
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(MoveConstructor, CircularDoublyLinkedListTest) {
|
||||
auto list2(std::move(list));
|
||||
BOOST_CHECK_EQUAL(list.empty(), true);
|
||||
BOOST_CHECK_EQUAL(list2.size(), 10);
|
||||
BOOST_CHECK_EQUAL(list2[9], 9);
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(Iterator, CircularDoublyLinkedListTest) {
|
||||
size_t i = 0;
|
||||
for (const auto &value : list) {
|
||||
BOOST_CHECK_EQUAL(value, i++);
|
||||
}
|
||||
BOOST_CHECK_EQUAL(list.size(), i);
|
||||
}
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
@ -1,6 +1,7 @@
|
||||
#include "IoContext.h"
|
||||
#include <boost/asio/executor_work_guard.hpp>
|
||||
#include <boost/scope_exit.hpp>
|
||||
#include <boost/stacktrace.hpp>
|
||||
|
||||
IoContext::~IoContext() {
|
||||
m_ioContext->stop();
|
||||
@ -23,6 +24,7 @@ void IoContext::runIoContext() {
|
||||
} catch (const boost::exception &e) {
|
||||
LOG(error) << boost::diagnostic_information(e);
|
||||
} catch (const std::exception &e) {
|
||||
LOG(error) << e.what();
|
||||
boost::stacktrace::stacktrace trace = boost::stacktrace::stacktrace::from_current_exception();
|
||||
LOG(error) << e.what() << ", trace:\n" << trace;
|
||||
}
|
||||
}
|
||||
|
@ -1,9 +1,9 @@
|
||||
#!/bin/bash
|
||||
|
||||
base_path=$(pwd)
|
||||
qt_prefix_path="/opt/Qt/6.6.1/gcc_64"
|
||||
qt_prefix_path="/opt/Qt/6.6.2/gcc_64"
|
||||
libraries_root="/opt/Libraries"
|
||||
if [ $base_path==/home/* ]; then
|
||||
if [ $base_path == /home/* ]; then
|
||||
build_path=${base_path}/build
|
||||
else
|
||||
build_path=/tmp/build
|
||||
@ -35,7 +35,7 @@ elif [ -d "/opt/Qt/5.15.2/gcc_64" ]; then
|
||||
-DQt5Svg_DIR=${qt_prefix_path}/lib/cmake/Qt5Svg "
|
||||
else
|
||||
cmake_qt_parameters=""
|
||||
echo "please install qt6.6.1 or qt5.15.2 ..."
|
||||
echo "please install qt6.6.2 or qt5.15.2 ..."
|
||||
fi
|
||||
|
||||
function cmake_scan() {
|
||||
@ -48,7 +48,7 @@ function cmake_scan() {
|
||||
-B ${build_path} \
|
||||
-DCMAKE_BUILD_TYPE=Debug \
|
||||
-DUNIT_TEST=ON \
|
||||
-DBOOST_ROOT=${libraries_root}/boost_1_84_0 \
|
||||
-DBOOST_ROOT=${libraries_root}/boost_1_85_0 \
|
||||
-DZeroMQ_ROOT=${libraries_root}/zeromq-4.3.4_debug \
|
||||
${cmake_qt_parameters}
|
||||
}
|
||||
@ -66,7 +66,7 @@ function build() {
|
||||
if [ $? -ne 0 ]; then
|
||||
exit 1
|
||||
fi
|
||||
build/UnitTest/UnitTest
|
||||
$build_path/UnitTest/UnitTest
|
||||
}
|
||||
|
||||
function main() {
|
||||
|
Loading…
Reference in New Issue
Block a user