Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions .clang-format
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
BasedOnStyle: Microsoft
IndentWidth: 4
UseTab: Always
AccessModifierOffset: 0
AccessModifierOffset: -4
AlwaysBreakTemplateDeclarations: Yes
# IndentAccessModifiers: false
# does not work
# https://clang.llvm.org/docs/ClangFormatStyleOptions.html
65 changes: 65 additions & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
on: push

jobs:
# check:
# runs-on: ubuntu-latest
# container: mikhail2001/young_devs_image
# steps:
# - uses: actions/checkout@v2
# - name: GO LINTER CHECK
# run: make check || exit 0
build:
runs-on: ubuntu-latest
container: mikhail2001/young_devs_image
steps:
- uses: actions/checkout@v2
- name: GO BUILD
run: make build
- name: Upload artifacts (EXECUTABLE FILE)
uses: actions/upload-artifact@v2
with:
name: executable-file
path: build/fib
test:
runs-on: ubuntu-latest
container: mikhail2001/young_devs_image
steps:
- uses: actions/checkout@v2
- run: make build TEST_OPT=ON
- run: make run
- run: ./build/tests/test_set --gtest_filter=TestBasicsFunctional*
- name: GO MY TESTS COVERAGE
run: |
make lcov
lcov --remove ./build/coverage.info -o ./build/coverage.info '/usr/include/*' '/usr/lib/*' $(echo $(pwd)/tests/\*)
make genhtml
- name: Upload artifacts (COVERAGE REPORT)
uses: actions/upload-artifact@v2
with:
name: coverage-report-my-tests
path: build/report
- run: make build TEST_OPT=ON
- run: make run
- run: make test
- name: GO ALL TESTS COVERAGE
run: |
make lcov
lcov --remove ./build/coverage.info -o ./build/coverage.info '/usr/include/*' '/usr/lib/*' $(echo $(pwd)/tests/\*)
make genhtml
- name: Upload artifacts (COVERAGE REPORT)
uses: actions/upload-artifact@v2
with:
name: coverage-report-all-tests
path: build/report
- name: GO VALGRIND TESTS
run: make valgrind_tests
- name: GO VALGRIND TARGET
run: make valgrind_target
- name: GO SANITIZER
run: |
make build SANITIZE_OPT=ON
make run
- name: GO SCAN-BUILD
run: |
make build
make scan_build
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
/build
/.vscode
test.cpp
38 changes: 38 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
cmake_minimum_required(VERSION 3.0.0)
project(main)

set(CMAKE_CXX_STANDARD 17)

find_package(Threads REQUIRED)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")

option(TEST_OPT "build test version" OFF)
option(DEBUG_OPT "build debug version" ON)
option(SANITIZE_OPT "build with flags -fsanitize" OFF)

add_subdirectory(set_lib)

add_executable(${PROJECT_NAME} main.cpp)

if(TEST_OPT)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage -fPIC -O0")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -coverage -lgcov" )
endif()

if(DEBUG_OPT)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -g2 -fPIC -O0")
endif()

if(SANITIZE_OPT)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address,undefined" )
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address,undefined")
endif()


target_include_directories(${PROJECT_NAME} PUBLIC ${SET_LIB_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} PRIVATE ${SET_LIB_LIBRARIES})

if (TEST_OPT)
enable_testing()
add_subdirectory(tests)
endif()
10 changes: 10 additions & 0 deletions CPPLINT.cfg
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
headers=h
linelength=110
filter=-whitespace/tab
filter=-runtime/int
filter=-legal/copyright
filter=-build/header_guard
filter=-build/include_subdir
filter=-build/include
filter=-readability/casting
filter=-whitespace/braces
14 changes: 14 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
FROM ubuntu:latest
RUN apt update -y && \
apt install -y wget g++ make binutils cmake cppcheck clang-tidy python3-pip libc6-dbg cmake libgtest-dev lcov clang-tools vim
RUN apt install -y libboost-dev libboost-all-dev
RUN apt install -y clang-format
RUN apt install -y git curl
RUN pip install cpplint
RUN wget https://sourceware.org/pub/valgrind/valgrind-3.18.1.tar.bz2 && \
tar xfv valgrind-3.18.1.tar.bz2 && \
cd valgrind-3.18.1 && \
./autogen.sh && \
./configure && \
make && \
make install
55 changes: 55 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
BUILD_DIR = build
TESTS_DIR = tests
LIB_DIR = set_lib

# project(xxx) on CMakeLists
TESTS_EXE = test_set
TARGET_EXE = main

PATH_LINTERS_SCRIPT = linters/run.sh

TEST_OPT = OFF
DEBUG_OPT = OFF
SANITIZE_OPT = OFF

.PHONY: check build test clean run coverage

# Изменения в CMakeLists требует make build
# make build = cmake && cmake --build
build: clean
mkdir ${BUILD_DIR}
cd ${BUILD_DIR} && cmake .. -DTEST_OPT=${TEST_OPT} -DDEBUG_OPT=${DEBUG_OPT} -DSANITIZE_OPT=${SANITIZE_OPT} && $(MAKE) --no-print-directory

clean:
(rm -r ${BUILD_DIR} 2>/dev/null) || exit 0

# инкрементальная сборка и запуск исполняемого файла
run:
cd ${BUILD_DIR} && $(MAKE) --no-print-directory
./${BUILD_DIR}/${TARGET_EXE}

# запуск исполняемого файла с тестированием
test:
./${BUILD_DIR}/${TESTS_DIR}/${TESTS_EXE}

# проверка исходного кода
check:
chmod u+x ${PATH_LINTERS_SCRIPT} && ./${PATH_LINTERS_SCRIPT}

lcov:
cd ${BUILD_DIR} && lcov -t "testing_${LIB_DIR}" -o coverage.info -c -d ./${TESTS_DIR}/
genhtml:
cd ${BUILD_DIR} && genhtml -o report coverage.info

valgrind_tests:
valgrind --tool=memcheck --leak-check=yes ./${BUILD_DIR}/${TESTS_DIR}/${TESTS_EXE}

valgrind_target:
valgrind --tool=memcheck -s --leak-check=yes --error-exitcode=1 ./${BUILD_DIR}/${TARGET_EXE}

scan_build:
cd ${BUILD_DIR} && scan-build $(MAKE) --no-print-directory

formating:
clang-format -i -style=file main.cpp ${LIB_DIR}/include/*.h ${LIB_DIR}/include/*.hpp ${LIB_DIR}/src/*.cpp ${TESTS_DIR}/*.cpp

21 changes: 21 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,23 @@
# techopark_cpp_hw
Репозиторий для сдачи домашних работ по С++ в Технопарке

### Мяделец Михаил WEB-11
**STL-совместимый контейнер**
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Добавь само задание в ридми, подпиши работу


Необходимо реализовать упрощённую версию упорядоченного множества из STL Set<T>. Асимптотики всех операций должны быть аналогичными std::set. Сравнение элементов типа T осуществлять только при помощи оператора <.
Необходимо поддержать следующие методы:
1) методы жизненного цикла - 4б
- конструктор по умолчанию;
- конструктор, принимающий пару итераторов элементов типа T, последовательно вставляемых в контейнер;
- конструктор, принимающий std::initializer_list элементов типа T;
- конструктор копирования ("глубокое копирование всех узлов контейнера");
- оператор присваивания;
- деструктор;

2) класс должен предоставлять const bidirectional-итератор для доступа к элементам, а также методы begin и end, и позволять просматривать все элементы контейнера без возможности их изменения, перемещаясь от каждого к следующему/предыдущему за O(1). Так как контейнер упорядоченный, то подразумевается их перебор в порядке возрастания - 4б;

3) методы insert и erase вставки и удаления элементов из контейнера. Тип возвращаемого значения - void, При наличии/отсутствии элемента ничего делать не нужно. При модификации контейнера любой из этих операций итераторы могут инвалидироваться - 3б;

4) константные методы:
- size и empty, возвращающие количество элементов и true/false в зависимости от наличия элементов в контейнере - 1б;
- find и lower_bound, которые возвращают соответственно итератор на искомый элемент во множестве/первый элемент, который не меньше искомого (или end() при его отсутствии) - 3б.
50 changes: 50 additions & 0 deletions linters/run.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
#!/usr/bin/env bash

set -o pipefail

SRC_PATHS="main.cpp set_lib/src/*.cpp"
INCLUDE_PATHS="set_lib/include/*.h"
INCLUDE_PATHS_HPP="set_lib/include/*.hpp"
TESTS_PATHS="tests/*.cpp"

INCLUDE_DIRECTORIES="set_lib/include"

function print_header() {
echo -e "\n***** ${1} *****"
}

function check_log() {
LOG=$( { ${1}; } 2>&1 )
STATUS=$?
echo "$LOG"
if echo "$LOG" | grep -q -E "${2}"
then
exit 1
fi

if [ $STATUS -ne 0 ]
then
exit $STATUS
fi
}

# ********** cppcheck **********
print_header "RUN cppcheck"
check_log "cppcheck ${SRC_PATHS} ${INCLUDE_PATHS} ${INCLUDE_PATHS_HPP} ${TESTS_PATHS} --enable=all --inconclusive --error-exitcode=1 -I${INCLUDE_DIRECTORIES} --suppress=missingIncludeSystem" "\(information\)"

# # ********** clang-tidy **********
print_header "RUN clang-tidy"
check_log "clang-tidy ${SRC_PATHS} ${TESTS_PATHS} -warnings-as-errors=* -extra-arg=-std=c++17 -- -I${INCLUDE_DIRECTORIES} -x c++" "Error (?:reading|while processing)"


# # ********** cpplint **********
print_header "RUN cpplint"
check_log "cpplint --extensions=cpp ${SRC_PATHS} ${TESTS_PATHS}" "Can't open for reading"
check_log "cpplint --extensions=h ${INCLUDE_PATHS} ${INCLUDE_PATHS_HPP}" "Can't open for reading"


# # ********** clang-format **********
print_header "RUN clang-format"
diff <(clang-format --style=Microsoft ${SRC_PATHS} ${INCLUDE_PATHS} ${INCLUDE_PATHS_HPP} ${TESTS_PATHS}) <(cat ${SRC_PATHS} ${INCLUDE_PATHS} ${INCLUDE_PATHS_HPP} ${TESTS_PATHS}) || exit 1

print_header "SUCCESS"
15 changes: 15 additions & 0 deletions main.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#include "iterator.h"
#include "set.h"
#include <vector>

using std::cout;
using std::endl;

int main(int argc, const char *argv[])
{
Set<int> set = {1, 5, 3, 7, 34, 88, 23};
// for (auto elem : set)
// {
// std::cout << elem << std::endl;
// }
}
42 changes: 42 additions & 0 deletions set_lib/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
cmake_minimum_required(VERSION 3.0.0)
project(set_lib)

set(CMAKE_CXX_STANDARD 17)
# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wpedantic -Werror")

find_package(Threads REQUIRED)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")

if(TEST_OPT)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage -fPIC -O0")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -coverage -lgcov" )
endif()

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage -O0")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -coverage -lgcov" )

if(DEBUG_OPT)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g2 -fPIC -O0")
endif()

if(NOT DEBUG_OPT AND NOT TEST_OPT)
# релиз-версия
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -O3")
endif()

if(SANITIZE_OPT)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address,undefined" )
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address,undefined")
endif()

file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
file(GLOB INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/include)

add_library(${PROJECT_NAME} ${SOURCES})
target_include_directories(${PROJECT_NAME} PUBLIC ${INCLUDE_DIRS})

message("SOURCES = ${SOURCES}")
message("INCLUDE_DIRS = ${INCLUDE_DIRS}")

set(SET_LIB_LIBRARIES ${PROJECT_NAME} PARENT_SCOPE)
set(SET_LIB_INCLUDE_DIRS ${INCLUDE_DIRS} PARENT_SCOPE)
46 changes: 46 additions & 0 deletions set_lib/include/iterator.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
#pragma once

#include "set.h"

template <typename T, typename Cmp>
class Iterator
{
public:
using key_type = T;
using value_type = T;
using size_type = std::size_t;
using difference_type = std::ptrdiff_t;
using key_compare = Cmp;
using value_compare = Cmp;
using reference = T &;
using const_reference = const T &;
using pointer = T *;
using const_pointer = const T *;
using iterator_category = std::bidirectional_iterator_tag;

Iterator(typename Set<T, Cmp>::Node *node, typename Set<T, Cmp>::Node *root, bool after_end = false,
bool before_begin = false);
Iterator() = default;

Iterator &operator=(const Iterator &) = default;

Iterator &operator++();
Iterator operator++(int);
Iterator &operator--();
Iterator operator--(int);

const_reference operator*();
const_pointer operator->();

bool operator==(const Iterator &);
bool operator!=(const Iterator &);

private:
typename Set<T, Cmp>::Node *node;
typename Set<T, Cmp>::Node *root;
// признаки местоположения итератора перед первым элементом и после последнего
bool before_begin = false;
bool after_end = false;
};

#include "iterator_definition.hpp"
Loading