From 9074cd80ef9c3d73c23f5f368a7f6d0dc2d83cb7 Mon Sep 17 00:00:00 2001 From: Mototroller Date: Sat, 25 Mar 2017 19:48:12 +0300 Subject: [PATCH] init BETA --- .gitmodules | 3 + .travis.yml | 32 +++++ CMakeLists.txt | 14 +++ README.md | 2 +- ax.core | 1 + include/preFIX.hpp | 165 +++++++++++++++++++++++++ include/preFIX_dict.hpp | 263 ++++++++++++++++++++++++++++++++++++++++ tests/tests.cpp | 117 ++++++++++++++++++ 8 files changed, 596 insertions(+), 1 deletion(-) create mode 100644 .gitmodules create mode 100644 .travis.yml create mode 100644 CMakeLists.txt create mode 160000 ax.core create mode 100644 include/preFIX.hpp create mode 100644 include/preFIX_dict.hpp create mode 100644 tests/tests.cpp diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..d03b0c4 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "ax.core"] + path = ax.core + url = https://github.com/Mototroller/ax.core.git diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..fa9889e --- /dev/null +++ b/.travis.yml @@ -0,0 +1,32 @@ +sudo: required +dist: precise +language: cpp + +matrix: + include: + - compiler: gcc + addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - g++-5 + env: COMPILER=g++-5 + - compiler: clang + addons: + apt: + sources: + - ubuntu-toolchain-r-test + - llvm-toolchain-precise-3.7 + packages: + - clang-3.7 + env: COMPILER=clang++-3.7 + +before_install: + - sudo apt-get update -qq + +script: + - mkdir build + - cd build + - cmake -DCMAKE_CXX_COMPILER=$COMPILER .. && make + - ./AX_PREFIX_TEST diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..bfa2805 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,14 @@ +cmake_minimum_required (VERSION 2.8.7) +project (AX_PREFIX_TEST) + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -pedantic") + +set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 -g") +set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -march=native") + +set(SRC_LIST tests/tests.cpp) + +include_directories(${CMAKE_CURRENT_SOURCE_DIR} ax.core/include) +include_directories(${PROJECT_NAME} include) + +add_executable(${PROJECT_NAME} ${SRC_LIST}) diff --git a/README.md b/README.md index bfaa008..6221e52 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -# preFIX \ No newline at end of file +# preFIX [![Build Status](https://travis-ci.org/Mototroller/preFIX.svg?branch=master)](https://travis-ci.org/Mototroller/preFIX) \ No newline at end of file diff --git a/ax.core b/ax.core new file mode 160000 index 0000000..4b9841a --- /dev/null +++ b/ax.core @@ -0,0 +1 @@ +Subproject commit 4b9841ab0159388a0ef120a2633f9ddab1261115 diff --git a/include/preFIX.hpp b/include/preFIX.hpp new file mode 100644 index 0000000..99f0c50 --- /dev/null +++ b/include/preFIX.hpp @@ -0,0 +1,165 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include + +#define LOG_HEAD "[preFIX]: " + +namespace preFIX { + +using size_t = std::size_t; + +enum : char { SOH = 0x1 }; + +/// Peplaces SOH inside string by given symbol ('|' by default) +std::string replace_SOH(std::string str, char symbol = '|') { + std::replace(str.begin(), str.end(), char(SOH), symbol); + return str; +} + +/*// Contains compile-time djb2 hash implementation +namespace hash { + constexpr size_t djb2_impl(char const* str, size_t hash) { + return *str == char{0} ? hash : + djb2_impl(str + 1, ((hash << 5) + hash) + *str); + } + + constexpr size_t djb2(char const* str) { + return djb2_impl(str, 5381); } + + /// some_tpl + constexpr size_t H(char const* str) { + return djb2(str); } + + /// some_tpl<"string"__> + constexpr size_t operator ""__(char const* str, size_t) { + return H(str); } +} + +namespace meta { + /// Concatenates two tuple-like classes + template + struct tuple_concat; + + template < + template class T, + class... Alist, + class... Blist + > struct tuple_concat, T> { using type = T; }; + + template + using tuple_concat_t = typename tuple_concat::type; + + + /// Pushes type to tuple-like class + template + struct tuple_push; + + template < + template class Tuple, + class... Args, + class T + > struct tuple_push,T> { using type = Tuple; }; + + template + using tuple_push_t = typename tuple_push::type; +} +//*/ + +/// Contains basic types arithmetics and mapping (FIX <=> native) +namespace types { + + /// Default serializer: {ostringstream(dst) << value} + template + struct sstream_serializer { + template + static size_t serialize(char* dst, U&& value, char delimiter = SOH) { + std::ostringstream ss; ss << std::forward(value); + std::string str = ss.str(); + std::memcpy(dst, str.data(), str.size()); + dst[str.size()] = delimiter; + return str.size() + 1; + } + }; + + /// Default deserializer: {istringstream(src) >> value} + template + struct sstream_deserializer { + template + static size_t deserialize(char const* src, U& value, char delimiter = SOH) { + std::string str(src, static_cast(std::strchr(src, delimiter))); + std::istringstream ss(str); ss >> value; + return str.size() + 1; + } + }; + + /// Special serializer + template + struct fixed_width_int_serializer { + template + static size_t serialize(char* dst, U&& value, char delimiter = SOH) { + std::ostringstream ss; + ss << std::setfill('0') << std::setw(Width) << std::forward(value); + std::string str = ss.str(); + std::memcpy(dst, str.data(), str.size()); + dst[str.size()] = delimiter; + return str.size() + 1; + } + }; + + template < + typename T, + class serializer = sstream_serializer, + class deserializer = sstream_deserializer + > + struct base_t : serializer, deserializer { + using underlying_type = T; + underlying_type value; + + base_t() = default; + explicit base_t(underlying_type const& v) : value(v) {} + + template + base_t& operator=(U&& v) { + value = std::forward(v); + return *this; + } + + using serializer::serialize; + using deserializer::deserialize; + + size_t serialize(char* dst) const { + return serialize(dst, value); } + + size_t deserialize(char const* src) { + return deserialize(src, value); } + }; + + using Int = base_t; + using Float = base_t; + using Char = base_t; + using String = base_t; + + template + using Fixed = base_t>; + + /// Writes preamble: "TAG=", @returns populated size + size_t serialize_tag(char* dst, int tag) { + return types::Int::serialize(dst, tag, '='); } + + /// Parses preamble: "TAG=" => tag, @returns read size + size_t deserialize_tag(char const* src, int& tag) { + return types::Int::deserialize(src, tag, '='); } +} + + + +} // preFIX + +#undef LOG_HEAD diff --git a/include/preFIX_dict.hpp b/include/preFIX_dict.hpp new file mode 100644 index 0000000..3d364fc --- /dev/null +++ b/include/preFIX_dict.hpp @@ -0,0 +1,263 @@ +#pragma once + +#include +#include +#include + +#include + +namespace preFIX { + +namespace dict { + + using namespace preFIX::types; + + namespace details { + /// Contains index of type inside tuple-like class + template + struct idx_of; + + template