root/src/apps/debuganalyzer/util/TimeUtils.h
/*
 * Copyright 2009-2012, Ingo Weinhold, ingo_weinhold@gmx.de.
 * Distributed under the terms of the MIT License.
 */
#ifndef TIME_UTILS_H
#define TIME_UTILS_H


#include <stdio.h>


struct decomposed_bigtime {
        nanotime_t      hours;
        int                     minutes;
        int                     seconds;
        int                     micros;
};


struct decomposed_nanotime {
        nanotime_t      hours;
        int                     minutes;
        int                     seconds;
        int                     nanos;
};


static void
decompose_time(bigtime_t time, decomposed_bigtime& decomposed)
{
        // nanosecs
        decomposed.micros = time % 1000000;
        time /= 1000000;
        // secs
        decomposed.seconds = time % 60;
        time /= 60;
        // mins
        decomposed.minutes = time % 60;
        time /= 60;
        // hours
        decomposed.hours = time;
}


static void
decompose_time(nanotime_t time, decomposed_nanotime& decomposed)
{
        // nanosecs
        decomposed.nanos = time % 1000000000;
        time /= 1000000000;
        // secs
        decomposed.seconds = time % 60;
        time /= 60;
        // mins
        decomposed.minutes = time % 60;
        time /= 60;
        // hours
        decomposed.hours = time;
}


static inline const char*
format_bigtime(bigtime_t time, char* buffer, size_t bufferSize)
{
        decomposed_bigtime decomposed;
        decompose_time(time, decomposed);

        snprintf(buffer, bufferSize, "%02" B_PRId64 ":%02d:%02d:%06d",
                decomposed.hours, decomposed.minutes, decomposed.seconds,
                decomposed.micros);
        return buffer;
}


static inline BString
format_bigtime(bigtime_t time)
{
        char buffer[64];
        format_bigtime(time, buffer, sizeof(buffer));
        return BString(buffer);
}


static inline const char*
format_nanotime(nanotime_t time, char* buffer, size_t bufferSize)
{
        decomposed_nanotime decomposed;
        decompose_time(time, decomposed);

        snprintf(buffer, bufferSize, "%02" B_PRId64 ":%02d:%02d:%09d",
                decomposed.hours, decomposed.minutes, decomposed.seconds,
                decomposed.nanos);
        return buffer;
}


static inline BString
format_nanotime(nanotime_t time)
{
        char buffer[64];
        format_nanotime(time, buffer, sizeof(buffer));
        return BString(buffer);
}


#endif  // TIME_UTILS_H