#include "Timer.h"

namespace jf {

// 计算两个时间的差值
void Timer::substract(const struct timeval *tv1, const struct timeval *tv2, struct timeval *tvres) {
    // 变量声明
    const struct timeval *tmptv1;
    const struct timeval *tmptv2;
    int cmpres;

    // 比较tv1和tv2，将较大值赋给tmptv1，较小值赋给tmptv2
    cmpres = compare(tv1, tv2);
    if (cmpres > 0) {
        tmptv1 = tv1;
        tmptv2 = tv2;
    } else {
        tmptv1 = tv2;
        tmptv2 = tv1;
    }

    // 做差时存在借位的情况
    if (tmptv1->tv_usec < tmptv2->tv_usec) {
        // 结果的秒数多减1，借给微秒
        tvres->tv_sec = tmptv1->tv_sec - tmptv2->tv_sec - 1;
        // 微秒做减法时，先加上借来的一秒(1000000微秒)
        tvres->tv_usec = tmptv1->tv_usec + 1000000 - tmptv2->tv_usec;
        // 不存在借位的情况
    } else {
        // 对应的秒和微秒分别做差
        tvres->tv_sec = tmptv1->tv_sec - tmptv2->tv_sec;
        tvres->tv_usec = tmptv1->tv_usec - tmptv2->tv_usec;
    }
}

int Timer::compare(const timeval *tv1, const timeval *tv2) {
    // 如果秒值不一致则秒值大者较大
    if (tv1->tv_sec > tv2->tv_sec)
        return 1;
    else if (tv1->tv_sec < tv2->tv_sec)
        return -1;
    // 秒值相同的，微秒值较大者较大
    else if (tv1->tv_usec > tv2->tv_usec)
        return 1;
    else if (tv1->tv_usec < tv2->tv_usec)
        return -1;
    // 秒值和微秒值皆相同者等值
    else
        return 0;
}

}  // namespace jf
