/*
* Copyright 2008 Free Software Foundation, Inc.
*
* SPDX-License-Identifier: AGPL-3.0+
*
* This software is distributed under the terms of the GNU Affero Public License.
* See the COPYING file in the main directory for details.
*
* This use of this software may be subject to additional restrictions.
* See the LEGAL file in the main directory for details.

	This program is free software: you can redistribute it and/or modify
	it under the terms of the GNU Affero General Public License as published by
	the Free Software Foundation, either version 3 of the License, or
	(at your option) any later version.

	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU Affero General Public License for more details.

	You should have received a copy of the GNU Affero General Public License
	along with this program.  If not, see <http://www.gnu.org/licenses/>.

*/



#include "Timeval.h"

extern "C" {
#include <osmocom/core/timer.h>
}

using namespace std;

void Timeval::now()
{
	osmo_clock_gettime(CLOCK_REALTIME, &mTimespec);
}

void Timeval::future(unsigned offset)
{
	now();
	unsigned sec = offset/1000;
	unsigned msec = offset%1000;
	mTimespec.tv_nsec += msec*1000*1000;
	mTimespec.tv_sec += sec;
	if (mTimespec.tv_nsec > 1000*1000*1000) {
		mTimespec.tv_nsec -= 1000*1000*1000;
		mTimespec.tv_sec += 1;
	}
}


struct timespec Timeval::timespec() const
{
	return mTimespec;
}


bool Timeval::passed() const
{
	Timeval nowTime;
	if (nowTime.mTimespec.tv_sec < mTimespec.tv_sec) return false;
	if (nowTime.mTimespec.tv_sec > mTimespec.tv_sec) return true;
	if (nowTime.mTimespec.tv_nsec >= mTimespec.tv_nsec) return true;
	return false;
}

double Timeval::seconds() const
{
	return ((double)mTimespec.tv_sec) + 1e-9*((double)mTimespec.tv_nsec);
}



long Timeval::delta(const Timeval& other) const
{
	// 2^31 milliseconds is just over 4 years.
	int32_t deltaS = other.sec() - sec();
	int32_t deltaNs = other.nsec() - nsec();
	return 1000*deltaS + deltaNs/1000000;
}




ostream& operator<<(ostream& os, const Timeval& tv)
{
	ios_base::fmtflags flags_backup = os.setf( ios::fixed, ios::floatfield );
	os << tv.seconds();
	os.flags( flags_backup );
	return os;
}


ostream& operator<<(ostream& os, const struct timespec& ts)
{
	os << ts.tv_sec << "," << ts.tv_nsec/1000;
	return os;
}



// vim: ts=4 sw=4
