Implement the type_name() function. Only tested on gcc 5.1

Add Sprout library.
This commit is contained in:
King_DuckZ 2015-06-24 22:13:48 +02:00
parent 6a39b82e5e
commit f1bcf8674d
14 changed files with 141 additions and 38 deletions

3
.gitmodules vendored Normal file
View file

@ -0,0 +1,3 @@
[submodule "lib/sprout"]
path = lib/sprout
url = https://github.com/bolero-MURAKAMI/Sprout.git

View file

@ -1,5 +1,6 @@
cmake_minimum_required(VERSION 2.8 FATAL_ERROR) cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
cmake_policy(SET CMP0040 NEW) #add_custom_command's target must exist cmake_policy(SET CMP0040 NEW) #add_custom_command's target must exist
project(doorkeeper_lib CXX C)
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -std=c++11 -g -O0 -Wall -Wextra") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -std=c++11 -g -O0 -Wall -Wextra")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -std=c++11 -O3 -Wall -Wextra") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -std=c++11 -O3 -Wall -Wextra")
@ -9,14 +10,18 @@ add_definitions(-DWITH_VECTOR_IOSTREAM)
find_library(Boost 1.53.0 REQUIRED) find_library(Boost 1.53.0 REQUIRED)
include_directories(SYSTEM add_library(${PROJECT_NAME} INTERFACE)
${Boost_INCLUDE_DIRECTORIES}
target_include_directories(${PROJECT_NAME} SYSTEM
INTERFACE ${Boost_INCLUDE_DIRECTORIES}
) )
include_directories( target_include_directories(${PROJECT_NAME}
include/ INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/include
INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/lib/sprout
) )
add_subdirectory(lib/sprout)
add_subdirectory(src) add_subdirectory(src)
add_subdirectory(test) add_subdirectory(test)
add_subdirectory(game) add_subdirectory(game)

View file

@ -16,7 +16,7 @@ int main() {
IntPoolType pool; IntPoolType pool;
pool.opener = [](const std::string& parName) { std::cout << "Opening " << parName << std::endl; return new dkh::AsciiMapSource(parName, coords2(10, 8), dk::MapType_IsometricStaggered, coords2(64, 64)); }; pool.opener = [](const std::string& parName) { std::cout << "Opening " << parName << std::endl; return new dkh::AsciiMapSource(parName, coords2(10, 8), dk::MapType_IsometricStaggered, coords2(64, 64)); };
dkh::PushLayerMapType<2> pushers; dkh::PushLayerMapType<2> pushers;
pushers.insert(std::make_pair(dk::make_signature_hash<int, 2>(), &Tyler2d::push_layer_void<int>)); pushers.insert(std::make_pair(dk::type_name_hash<int>(), &Tyler2d::push_layer_void<int>));
Tyler2d tiler(dkh::call_map_load(pool, std::string("test_level.dk"), pushers)); Tyler2d tiler(dkh::call_map_load(pool, std::string("test_level.dk"), pushers));
return 0; return 0;

View file

@ -3,7 +3,7 @@
#include "doorkeeper/implem/maptypes.hpp" #include "doorkeeper/implem/maptypes.hpp"
#include "doorkeeper/primitivetypes.hpp" #include "doorkeeper/primitivetypes.hpp"
#include "doorkeeper/helpers/hashing.hpp" #include "doorkeeper/helpers/typename.hpp"
#include "doorkeeper/implem/coords_utils.hpp" #include "doorkeeper/implem/coords_utils.hpp"
#include <cstdint> #include <cstdint>
#include <vector> #include <vector>

View file

@ -3,7 +3,7 @@
#include "doorkeeper/components/tyler.hpp" #include "doorkeeper/components/tyler.hpp"
#include "doorkeeper/components/basemapsource.hpp" #include "doorkeeper/components/basemapsource.hpp"
#include "doorkeeper/helpers/hashing.hpp" #include "doorkeeper/helpers/typename.hpp"
#include "doorkeeper/components/exception.hpp" #include "doorkeeper/components/exception.hpp"
#include <cstdint> #include <cstdint>
#include <utility> #include <utility>

View file

@ -1,5 +1,5 @@
#ifndef id4E5F8A0ABA6047BA988D512351B9DD2D #ifndef id3A8D22AD652142C9A44142EC942E4482
#define id4E5F8A0ABA6047BA988D512351B9DD2D #define id3A8D22AD652142C9A44142EC942E4482
#include "doorkeeper/implem/doorkeeper_conf.h" #include "doorkeeper/implem/doorkeeper_conf.h"
@ -16,7 +16,7 @@
#endif #endif
#if defined(IS_PRETTY_FUNC_CONSTEXPR) #if defined(IS_PRETTY_FUNC_CONSTEXPR)
# include "doorkeeper/implem/string_bt.hpp" # include "sprout/string.hpp"
# include "doorkeeper/implem/tiger_bt.hpp" # include "doorkeeper/implem/tiger_bt.hpp"
# include <stdexcept> # include <stdexcept>
#endif #endif
@ -35,15 +35,38 @@ namespace dk {
bool operator< ( const HashType& parL, const HashType& parR ); bool operator< ( const HashType& parL, const HashType& parR );
template <typename T, uint32_t D>
HashType make_signature_hash ( void ) a_pure;
namespace implem { namespace implem {
HashType hash_string ( const char* parString, std::size_t parLen ) a_pure; HashType hash_string ( const char* parString, std::size_t parLen ) a_pure;
#if defined(IS_PRETTY_FUNC_CONSTEXPR)
template <typename T>
struct type_name_info {
constexpr type_name_info ( void );
const std::size_t len;
const char* const str;
};
template <typename T>
constexpr std::size_t type_name_len ( void ) a_pure;
#endif
} //namespace implem } //namespace implem
template <typename T>
#if defined(IS_PRETTY_FUNC_CONSTEXPR)
constexpr
#endif
HashType type_name_hash ( void ) a_pure;
template <typename T>
#if defined(IS_PRETTY_FUNC_CONSTEXPR)
constexpr sprout::string<implem::type_name_len<T>()> type_name ( void ) a_pure;
#else
std::string type_name ( void ) a_pure;
#endif
} //namespace dk } //namespace dk
#include "doorkeeper/implem/hashing.inl" #include "doorkeeper/implem/typename.inl"
#if defined(IS_PRETTY_FUNC_CONSTEXPR) #if defined(IS_PRETTY_FUNC_CONSTEXPR)
# undef IS_PRETTY_FUNC_CONSTEXPR # undef IS_PRETTY_FUNC_CONSTEXPR

View file

@ -1,19 +0,0 @@
namespace dk {
template <typename T, uint32_t D>
inline HashType make_signature_hash() {
#if defined(IS_PRETTY_FUNC_CONSTEXPR)
//static_assert(dk::tiger("a", 1, 0x01).a == 0xABF87E2EEFFBBE77ULL, "Bug in tiger hash");
//static_assert(dk::tiger("message digest", 14, 0x01).a == 0x951A2078CBF881D9ULL, "Bug in tiger hash");
constexpr bt::string<sizeof(__PRETTY_FUNCTION__)-1> func_pretty(__PRETTY_FUNCTION__);
// set padding to 0x80 for tiger V2
constexpr HashType retval = dk::tiger(func_pretty.data(), func_pretty.size(), 0x01);
return retval;
#else
const char* const pf = __PRETTY_FUNCTION__;
const std::size_t len = sizeof(__PRETTY_FUNCTION__) - 1;
return implem::hash_string(pf, len);
#endif
}
} //namespace dk

View file

@ -1,7 +1,7 @@
#ifndef id1E6CCE44307549A9B6C9E4E5923AC002 #ifndef id1E6CCE44307549A9B6C9E4E5923AC002
#define id1E6CCE44307549A9B6C9E4E5923AC002 #define id1E6CCE44307549A9B6C9E4E5923AC002
#include "doorkeeper/helpers/hashing.hpp" //#include "doorkeeper/helpers/hashing.hpp"
#include "doorkeeper/implem/compatibility.h" #include "doorkeeper/implem/compatibility.h"
#include <cstdint> #include <cstdint>
#include <ciso646> #include <ciso646>

View file

@ -0,0 +1,71 @@
namespace dk {
template <typename T>
#if defined(IS_PRETTY_FUNC_CONSTEXPR)
constexpr
#endif
inline HashType type_name_hash() {
#if defined(IS_PRETTY_FUNC_CONSTEXPR)
//static_assert(dk::tiger("a", 1, 0x01).a == 0xABF87E2EEFFBBE77ULL, "Bug in tiger hash");
//static_assert(dk::tiger("message digest", 14, 0x01).a == 0x951A2078CBF881D9ULL, "Bug in tiger hash");
// set padding to 0x80 for tiger V2
return dk::tiger(type_name<T>().data(), type_name<T>().size(), 0x01);
#else
const auto retstring = type_name<T>();
return implem::hash_string(retstring.data(), retstring.size());
#endif
}
template <typename T>
#if defined(IS_PRETTY_FUNC_CONSTEXPR)
constexpr inline sprout::string<implem::type_name_len<T>()> type_name()
#else
inline std::string type_name()
#endif
{
#if defined(IS_PRETTY_FUNC_CONSTEXPR)
# if defined(__GNUC__)
typedef sprout::string<implem::type_name_info<T>().len> sproutstring;
typedef sprout::string<implem::type_name_len<T>()> sproutstringret;
return sproutstringret(
implem::type_name_info<T>().str + sproutstring(implem::type_name_info<T>().str).find(
'=',
sproutstring(implem::type_name_info<T>().str).find('[')
) + 2,
implem::type_name_len<T>() - 1
);
# else
# error "not implemented"
# endif
#else
# error "not implemented"
const char* const pf = __PRETTY_FUNCTION__;
const std::size_t len = sizeof(__PRETTY_FUNCTION__) - 1;
#endif
}
namespace implem {
template <typename T>
constexpr type_name_info<T>::type_name_info() :
len(sizeof(__PRETTY_FUNCTION__)),
str(__PRETTY_FUNCTION__)
{
}
#if defined(IS_PRETTY_FUNC_CONSTEXPR)
template <typename T>
constexpr std::size_t type_name_len() {
typedef sprout::string<implem::type_name_info<T>().len> sproutstring;
# if defined(__GNUC__)
return type_name_info<T>().len - sproutstring(
implem::type_name_info<T>().str).find('=', sproutstring(implem::type_name_info<T>().str).find('[')) - 3;
# else
# error "not implemented"
# endif
}
#endif
} //namespace implem
} //namespace dk

1
lib/sprout Submodule

@ -0,0 +1 @@
Subproject commit 79ed131e71ab4ec5b19d6bc1b285f9080acaaa45

View file

@ -16,10 +16,14 @@ add_library(${PROJECT_NAME}
asciimapsource.cpp asciimapsource.cpp
tylermapsource.cpp tylermapsource.cpp
tiger.c tiger.c
hashing.cpp typename.cpp
) )
target_include_directories(${PROJECT_NAME} target_include_directories(${PROJECT_NAME}
PRIVATE . PRIVATE .
PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/include PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/include
) )
target_link_libraries(${PROJECT_NAME}
doorkeeper_lib
)

View file

@ -1,6 +1,6 @@
#include "doorkeeper/helpers/asciimapsource.hpp" #include "doorkeeper/helpers/asciimapsource.hpp"
#include "doorkeeper/implem/compatibility.h" #include "doorkeeper/implem/compatibility.h"
#include "doorkeeper/helpers/hashing.hpp" #include "doorkeeper/helpers/typename.hpp"
#include "asciimap_parser.hpp" #include "asciimap_parser.hpp"
#include <fstream> #include <fstream>
#include <iomanip> #include <iomanip>
@ -115,6 +115,6 @@ namespace dkh {
#else #else
(void)parIndex; (void)parIndex;
#endif #endif
return dk::make_signature_hash<int, 2>(); return dk::type_name_hash<int>();
} }
} //namespace dkh } //namespace dkh

View file

@ -1,4 +1,4 @@
#include "doorkeeper/helpers/hashing.hpp" #include "doorkeeper/helpers/typename.hpp"
#include "tiger.h" #include "tiger.h"
namespace dk { namespace dk {

View file

@ -23,6 +23,13 @@ struct LayerWithData {
std::string path; std::string path;
}; };
#include "doorkeeper/helpers/typename.hpp"
std::ostream& operator<< (std::ostream& parStream, const dk::HashType& parHash) {
parStream << std::hex << parHash.a << parHash.b << parHash.c;
return parStream;
}
namespace { namespace {
typedef std::unique_ptr<SDL_Renderer, void(*)(SDL_Renderer*)> SDLRendererUPtr; typedef std::unique_ptr<SDL_Renderer, void(*)(SDL_Renderer*)> SDLRendererUPtr;
typedef std::unique_ptr<SDL_Window, void(*)(SDL_Window*)> SDLWindowUPtr; typedef std::unique_ptr<SDL_Window, void(*)(SDL_Window*)> SDLWindowUPtr;
@ -42,6 +49,14 @@ namespace {
} //unnamed namespace } //unnamed namespace
int main() { int main() {
typedef dk::Tyler<2>::coords coords2;
std::cout << dk::type_name<coords2>() << '\n';
std::cout << dk::type_name<dk::Tyler<2>::coords>() << '\n';
std::cout << dk::type_name<int>() << '\n';
std::cout << dk::type_name<float>() << '\n';
std::cout << dk::type_name<std::vector<std::pair<std::map<std::string, unsigned short int>, bool>>>() << '\n';
std::cout << dk::type_name_hash<dk::Tyler<2>>() << '\n';
static constexpr auto h = dk::tiger("message digest", 14, 0x01); static constexpr auto h = dk::tiger("message digest", 14, 0x01);
std::cout << std::hex << h.a << '\n' << 0x951A2078CBF881D9ULL << std::endl; std::cout << std::hex << h.a << '\n' << 0x951A2078CBF881D9ULL << std::endl;