mirror of
https://github.com/NGSolve/netgen.git
synced 2024-11-11 16:49:16 +05:00
131 lines
3.8 KiB
C++
131 lines
3.8 KiB
C++
#include "ngcore_api.hpp"
|
|
#include "utils.hpp"
|
|
#include "logging.hpp"
|
|
#include "simd_generic.hpp"
|
|
|
|
#ifndef WIN32
|
|
#include <cxxabi.h>
|
|
#endif
|
|
#include <array>
|
|
#include <filesystem>
|
|
#include <iostream>
|
|
#include <regex>
|
|
|
|
#include "ngstream.hpp"
|
|
|
|
namespace ngcore
|
|
{
|
|
namespace detail
|
|
{
|
|
// see https://github.com/RobotLocomotion/drake/blob/master/common/nice_type_name.cc
|
|
static const auto demangle_regexes =
|
|
std::array<std::pair<std::regex, std::string>, 8>{
|
|
// Remove unwanted keywords and following space. (\b is word boundary.)
|
|
std::make_pair(std::regex("\\b(class|struct|enum|union) "), ""),
|
|
// Tidy up anonymous namespace.
|
|
{std::regex("[`(]anonymous namespace[')]"), "(anonymous)"},
|
|
// Replace Microsoft __int64 with long long.
|
|
{std::regex("\\b__int64\\b"), "long long"},
|
|
// Temporarily replace spaces we want to keep with "!". (\w is
|
|
// alphanumeric or underscore.)
|
|
{std::regex("(\\w) (\\w)"), "$1!$2"},
|
|
{std::regex(" "), ""}, // Delete unwanted spaces.
|
|
// Some compilers throw in extra namespaces like "__1" or "__cxx11".
|
|
// Delete them.
|
|
{std::regex("\\b__[[:alnum:]_]+::"), ""},
|
|
{std::regex("!"), " "}, // Restore wanted spaces.
|
|
|
|
// Recognize std::string's full name and abbreviate.
|
|
{std::regex("\\bstd::basic_string<char,std::char_traits<char>,"
|
|
"std::allocator<char>>"), "std::string"}
|
|
};
|
|
std::string CleanupDemangledName( std::string s )
|
|
{
|
|
for(const auto & [r, sub] : demangle_regexes)
|
|
s = std::regex_replace (s,r,sub);
|
|
|
|
return s;
|
|
}
|
|
} // namespace detail
|
|
|
|
// parallel netgen
|
|
int id = 0, ntasks = 1;
|
|
|
|
#ifdef WIN32
|
|
// windows does demangling in typeid(T).name()
|
|
NGCORE_API std::string Demangle(const char* typeinfo) {
|
|
std::string name = typeinfo;
|
|
return detail::CleanupDemangledName(name);
|
|
}
|
|
#else
|
|
NGCORE_API std::string Demangle(const char* typeinfo)
|
|
{
|
|
int status=0;
|
|
try
|
|
{
|
|
char *s = abi::__cxa_demangle(typeinfo, nullptr, nullptr, &status);
|
|
std::string result;
|
|
if (s == nullptr)
|
|
result = typeinfo;
|
|
else
|
|
{
|
|
result = s;
|
|
free(s);
|
|
}
|
|
result = detail::CleanupDemangledName(result);
|
|
return result;
|
|
}
|
|
catch( const std::exception & e )
|
|
{
|
|
GetLogger("utils")->warn("{}:{} cannot demangle {}, status: {}, error:{}", __FILE__, __LINE__, typeinfo, status, e.what());
|
|
}
|
|
std::string name = typeinfo;
|
|
return detail::CleanupDemangledName(name);
|
|
}
|
|
#endif
|
|
|
|
double seconds_per_tick = [] () noexcept
|
|
{
|
|
auto tick_start = GetTimeCounter();
|
|
double tstart = WallTime();
|
|
double tend = WallTime()+0.001;
|
|
|
|
// wait for 1ms and compare wall time with time counter
|
|
while(WallTime()<tend);
|
|
|
|
auto tick_end = GetTimeCounter();
|
|
tend = WallTime();
|
|
|
|
return (tend-tstart)/static_cast<double>(tick_end-tick_start);
|
|
}();
|
|
|
|
const std::chrono::time_point<TClock> wall_time_start = TClock::now();
|
|
|
|
int printmessage_importance = 0;
|
|
bool NGSOStream :: glob_active = true;
|
|
|
|
NGCORE_API int GetCompiledSIMDSize()
|
|
{
|
|
return GetDefaultSIMDSize();
|
|
}
|
|
|
|
NGCORE_API bool IsRangeCheckEnabled()
|
|
{
|
|
#ifdef NETGEN_ENABLE_CHECK_RANGE
|
|
return true;
|
|
#else
|
|
return false;
|
|
#endif
|
|
}
|
|
|
|
NGCORE_API std::filesystem::path GetTempFilename()
|
|
{
|
|
static int counter = 0;
|
|
auto path = std::filesystem::temp_directory_path();
|
|
path += ".temp_netgen_file_"+ToString(counter++)+"_"+ToString(GetTimeCounter());
|
|
return path;
|
|
}
|
|
|
|
} // namespace ngcore
|
|
|