Skip to content

Commit 9192150

Browse files
feat(wasm): add Emscripten/WebAssembly support
- Use microseconds for chrono conversion on Emscripten - Replace std::from_chars with std::strtod for floating-point parsing - Enable compilation to WebAssembly while maintaining native performance
1 parent 98fe7ad commit 9192150

3 files changed

Lines changed: 37 additions & 5 deletions

File tree

cmake/nfxDateTimeBuildConfig.cmake

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,6 @@ endif()
5555

5656
set(NFX_DATETIME_LICENSE_FILE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")
5757

58-
59-
60-
61-
62-
6358
#----------------------------------------------
6459
# Directory configuration
6560
#----------------------------------------------

src/DateTime.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1152,7 +1152,13 @@ namespace nfx::time
11521152
using ticks_duration = std::chrono::duration<std::int64_t, std::ratio<1, 10000000>>;
11531153
auto duration{ ticks_duration{ ticksSinceEpoch } };
11541154

1155+
#ifdef __EMSCRIPTEN__
1156+
// Emscripten system_clock uses microseconds, convert from 100ns ticks
1157+
auto micros = std::chrono::duration_cast<std::chrono::microseconds>( duration );
1158+
return std::chrono::system_clock::time_point{ micros };
1159+
#else
11551160
return std::chrono::system_clock::time_point{ duration };
1161+
#endif
11561162
}
11571163

11581164
DateTime DateTime::fromChrono( const std::chrono::system_clock::time_point& timePoint ) noexcept

src/TimeSpan.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,9 +330,16 @@ namespace nfx::time
330330
if( iso8601DurationString.find_first_not_of( "0123456789.-" ) == std::string_view::npos )
331331
{
332332
double seconds{};
333+
#ifdef __EMSCRIPTEN__
334+
// Emscripten doesn't support std::from_chars for floating point
335+
char* end;
336+
seconds = std::strtod( iso8601DurationString.data(), &end );
337+
if( end == iso8601DurationString.data() + iso8601DurationString.size() )
338+
#else
333339
auto [ptr, ec] = std::from_chars(
334340
iso8601DurationString.data(), iso8601DurationString.data() + iso8601DurationString.size(), seconds );
335341
if( ec == std::errc{} && ptr == iso8601DurationString.data() + iso8601DurationString.size() )
342+
#endif
336343
{
337344
result = TimeSpan::fromSeconds( seconds );
338345
return true;
@@ -366,8 +373,14 @@ namespace nfx::time
366373
if( dPos != std::string_view::npos )
367374
{
368375
auto dayStr{ datePart.substr( 0, dPos ) };
376+
#ifdef __EMSCRIPTEN__
377+
char* end;
378+
days = std::strtod( dayStr.data(), &end );
379+
if( end == dayStr.data() + dayStr.size() )
380+
#else
369381
auto [ptr, ec] = std::from_chars( dayStr.data(), dayStr.data() + dayStr.size(), days );
370382
if( ec == std::errc{} && ptr == dayStr.data() + dayStr.size() )
383+
#endif
371384
{
372385
foundComponent = true;
373386
}
@@ -428,8 +441,14 @@ namespace nfx::time
428441
{
429442
auto hourStr{ timePart.substr( 0, hPos ) };
430443
double hours{};
444+
#ifdef __EMSCRIPTEN__
445+
char* end;
446+
hours = std::strtod( hourStr.data(), &end );
447+
if( end == hourStr.data() + hourStr.size() )
448+
#else
431449
auto [ptr, ec] = std::from_chars( hourStr.data(), hourStr.data() + hourStr.size(), hours );
432450
if( ec == std::errc{} && ptr == hourStr.data() + hourStr.size() )
451+
#endif
433452
{
434453
totalSeconds += hours * static_cast<double>( constants::SECONDS_PER_HOUR );
435454
timePart = timePart.substr( hPos + 1 );
@@ -447,8 +466,14 @@ namespace nfx::time
447466
{
448467
auto minuteStr{ timePart.substr( 0, mPos ) };
449468
double minutes{};
469+
#ifdef __EMSCRIPTEN__
470+
char* end;
471+
minutes = std::strtod( minuteStr.data(), &end );
472+
if( end == minuteStr.data() + minuteStr.size() )
473+
#else
450474
auto [ptr, ec] = std::from_chars( minuteStr.data(), minuteStr.data() + minuteStr.size(), minutes );
451475
if( ec == std::errc{} && ptr == minuteStr.data() + minuteStr.size() )
476+
#endif
452477
{
453478
totalSeconds += minutes * static_cast<double>( constants::SECONDS_PER_MINUTE );
454479
timePart = timePart.substr( mPos + 1 );
@@ -466,8 +491,14 @@ namespace nfx::time
466491
{
467492
auto secondStr{ timePart.substr( 0, sPos ) };
468493
double seconds{};
494+
#ifdef __EMSCRIPTEN__
495+
char* end;
496+
seconds = std::strtod( secondStr.data(), &end );
497+
if( end == secondStr.data() + secondStr.size() )
498+
#else
469499
auto [ptr, ec] = std::from_chars( secondStr.data(), secondStr.data() + secondStr.size(), seconds );
470500
if( ec == std::errc{} && ptr == secondStr.data() + secondStr.size() )
501+
#endif
471502
{
472503
totalSeconds += seconds;
473504
foundComponent = true;

0 commit comments

Comments
 (0)