/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/** @file rs_time.rsh
 *  \brief RenderScript time routines
 *
 *  This file contains RenderScript functions relating to time and date
 *  manipulation.
 */

#ifndef __RS_TIME_RSH__
#define __RS_TIME_RSH__

/**
 * Calendar time interpreted as seconds elapsed since the Epoch (00:00:00 on
 * January 1, 1970, Coordinated Universal Time (UTC)).
 */
#ifndef __LP64__
typedef int rs_time_t;
#else
typedef long rs_time_t;
#endif

/**
 * Data structure for broken-down time components.
 *
 * tm_sec   - Seconds after the minute. This ranges from 0 to 59, but possibly
 *            up to 60 for leap seconds.
 * tm_min   - Minutes after the hour. This ranges from 0 to 59.
 * tm_hour  - Hours past midnight. This ranges from 0 to 23.
 * tm_mday  - Day of the month. This ranges from 1 to 31.
 * tm_mon   - Months since January. This ranges from 0 to 11.
 * tm_year  - Years since 1900.
 * tm_wday  - Days since Sunday. This ranges from 0 to 6.
 * tm_yday  - Days since January 1. This ranges from 0 to 365.
 * tm_isdst - Flag to indicate whether daylight saving time is in effect. The
 *            value is positive if it is in effect, zero if it is not, and
 *            negative if the information is not available.
 */
typedef struct {
    int tm_sec;     ///< seconds
    int tm_min;     ///< minutes
    int tm_hour;    ///< hours
    int tm_mday;    ///< day of the month
    int tm_mon;     ///< month
    int tm_year;    ///< year
    int tm_wday;    ///< day of the week
    int tm_yday;    ///< day of the year
    int tm_isdst;   ///< daylight savings time
} rs_tm;

/**
 * Returns the number of seconds since the Epoch (00:00:00 UTC, January 1,
 * 1970). If @p timer is non-NULL, the result is also stored in the memory
 * pointed to by this variable. If an error occurs, a value of -1 is returned.
 *
 * @param timer Location to also store the returned calendar time.
 *
 * @return Seconds since the Epoch.
 */
extern rs_time_t __attribute__((overloadable))
    rsTime(rs_time_t *timer);

/**
 * Converts the time specified by @p timer into broken-down time and stores it
 * in @p local. This function also returns a pointer to @p local. If @p local
 * is NULL, this function does nothing and returns NULL.
 *
 * @param local Broken-down time.
 * @param timer Input time as calendar time.
 *
 * @return Pointer to broken-down time (same as input @p local).
 */
extern rs_tm * __attribute__((overloadable))
    rsLocaltime(rs_tm *local, const rs_time_t *timer);

/**
 * Returns the current system clock (uptime) in milliseconds.
 *
 * @return Uptime in milliseconds.
 */
extern int64_t __attribute__((overloadable))
    rsUptimeMillis(void);

/**
 * Returns the current system clock (uptime) in nanoseconds.
 *
 * @return Uptime in nanoseconds.
 */
extern int64_t __attribute__((overloadable))
    rsUptimeNanos(void);

/**
 * Returns the time in seconds since this function was last called in this
 * script.
 *
 * @return Time in seconds.
 */
extern float __attribute__((overloadable))
    rsGetDt(void);

#endif
