Implement the type_name() function. Only tested on gcc 5.1
Add Sprout library.
This commit is contained in:
parent
6a39b82e5e
commit
f1bcf8674d
14 changed files with 141 additions and 38 deletions
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
[submodule "lib/sprout"]
|
||||||
|
path = lib/sprout
|
||||||
|
url = https://github.com/bolero-MURAKAMI/Sprout.git
|
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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
|
|
@ -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
|
|
|
@ -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>
|
||||||
|
|
71
include/doorkeeper/implem/typename.inl
Normal file
71
include/doorkeeper/implem/typename.inl
Normal 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
1
lib/sprout
Submodule
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 79ed131e71ab4ec5b19d6bc1b285f9080acaaa45
|
|
@ -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
|
||||||
|
)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#include "doorkeeper/helpers/hashing.hpp"
|
#include "doorkeeper/helpers/typename.hpp"
|
||||||
#include "tiger.h"
|
#include "tiger.h"
|
||||||
|
|
||||||
namespace dk {
|
namespace dk {
|
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue