• New clock !

    From Bonita Montero@Bonita.Montero@gmail.com to comp.lang.c on Sun Sep 7 18:57:38 2025
    From Newsgroup: comp.lang.c

    #pragma once
    #include <cstdint>
    #include <chrono>
    #if defined(_WIN32)
    #include <Windows.h>
    #elif defined(__unix__)
    #include <time.h>
    #else
    #error dasdasd
    #endif

    struct win_time
    {
    using rep = int64_t;
    using period = std::ratio<1, 10000000>;
    using duration = std::chrono::duration<rep, period>;
    using time_point = std::chrono::time_point<win_time, duration>;
    static time_point now() noexcept;
    static constexpr bool is_steady = true;
    private:
    static constexpr int64_t UNIX_START = 116444736000000000;
    };

    inline win_time::time_point win_time::now() noexcept
    {
    #if defined(_WIN32)
    FILETIME ft;
    GetSystemTimePreciseAsFileTime( &ft );
    return time_point( duration( (uint64_t)ft.dwHighDateTime << 32 | ft.dwLowDateTime ) );
    #elif defined(__unix__)
    timespec ts;
    clock_gettime( CLOCK_REALTIME, &ts );
    return time_point( duration( UNIX_START + (uint64_t)ts.tv_sec * 10'000'000u + ((uint64_t)ts.tv_nsec + 50u) / 100u ) );
    #endif
    }

    What does this do ?
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Bonita Montero@Bonita.Montero@gmail.com to comp.lang.c,comp.lang.c++ on Sun Sep 7 19:28:58 2025
    From Newsgroup: comp.lang.c

    Oh, wrong group.

    Am 07.09.2025 um 18:57 schrieb Bonita Montero:
    #pragma once
    #include <cstdint>
    #include <chrono>
    #if defined(_WIN32)
        #include <Windows.h>
    #elif defined(__unix__)
        #include <time.h>
    #else
        #error dasdasd
    #endif

    struct win_time
    {
        using rep = int64_t;
        using period = std::ratio<1, 10000000>;
        using duration = std::chrono::duration<rep, period>;
        using time_point = std::chrono::time_point<win_time, duration>;
        static time_point now() noexcept;
        static constexpr bool is_steady = true;
    private:
        static constexpr int64_t UNIX_START = 116444736000000000;
    };

    inline win_time::time_point win_time::now() noexcept
    {
    #if defined(_WIN32)
        FILETIME ft;
        GetSystemTimePreciseAsFileTime( &ft );
        return time_point( duration( (uint64_t)ft.dwHighDateTime << 32 | ft.dwLowDateTime ) );
    #elif defined(__unix__)
        timespec ts;
        clock_gettime( CLOCK_REALTIME, &ts );
        return time_point( duration( UNIX_START + (uint64_t)ts.tv_sec * 10'000'000u + ((uint64_t)ts.tv_nsec + 50u) / 100u ) );
    #endif
    }

    What does this do ?

    #pragma once
    #include <cstdint>
    #include <chrono>
    #if defined(_WIN32)
    #include <Windows.h>
    #elif defined(__unix__)
    #include <time.h>
    #else
    #error dasdasd
    #endif

    struct win_time
    {
    using rep = int64_t;
    using period = std::ratio<1, 10000000>;
    using duration = std::chrono::duration<rep, period>;
    using time_point = std::chrono::time_point<win_time, duration>;
    static time_point now() noexcept;
    static constexpr bool is_steady = false;
    private:
    static constexpr time_point UNIX_START = time_point( duration( 116444736000000000 ) );
    };

    inline win_time::time_point win_time::now() noexcept
    {
    #if defined(_WIN32)
    FILETIME ft;
    GetSystemTimePreciseAsFileTime( &ft );
    return time_point( duration( (uint64_t)ft.dwHighDateTime << 32 | ft.dwLowDateTime ) );
    #elif defined(__unix__)
    using namespace std::chrono;
    timespec ts;
    clock_gettime( CLOCK_REALTIME, &ts );
    return UNIX_START + duration_cast<win_time::duration>( seconds( ts.tv_sec ) + nanoseconds( ts.tv_nsec + 50 ) );
    #endif
    }

    --- Synchronet 3.21a-Linux NewsLink 1.2