/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

/*
** Class definitions for calendar time routines (ref: prtime.h)
*/

#if defined(_RCTIME_H)
#else
#define _RCTIME_H

#include "rcbase.h"

#include <prtime.h>

/*
** Class: RCTime (ref: prtime.h)
**
** RCTimes are objects that are intended to be used to represent calendar
** times. They maintain units internally as microseconds since the defined
** epoch (midnight, January 1, 1970, GMT). Conversions to and from external
** formats (PRExplodedTime) are available.
**
** In general, NCTimes possess normal algebretic capabilities.
*/

class PR_IMPLEMENT(RCTime): public RCBase
{
public:
    typedef enum {now} Current;

    RCTime();                       /* leaves the object unitialized */
    RCTime(Current);                /* initializes to current system time */
    RCTime(const RCTime&);          /* copy constructor */
    RCTime(const PRExplodedTime&);  /* construction from exploded representation */

    virtual ~RCTime();

    /* assignment operators */
    void operator=(const RCTime&); 
    void operator=(const PRExplodedTime&);

    /* comparitive operators */
    PRBool operator<(const RCTime&);
    PRBool operator>(const RCTime&);
    PRBool operator<=(const RCTime&);
    PRBool operator>=(const RCTime&);
    PRBool operator==(const RCTime&);

    /* associative operators */
    RCTime operator+(const RCTime&);
    RCTime operator-(const RCTime&);
    RCTime& operator+=(const RCTime&);
    RCTime& operator-=(const RCTime&);

    /* multiply and divide operators */
    RCTime operator/(PRUint64);
    RCTime operator*(PRUint64);
    RCTime& operator/=(PRUint64);
    RCTime& operator*=(PRUint64);

    void Now();                     /* assign current time to object */

private:
    PRTime gmt;

public:

    RCTime(PRTime);                 /* construct from raw PRTime */
    void operator=(PRTime);         /* assign from raw PRTime */
    operator PRTime() const;        /* extract internal representation */
};  /* RCTime */

inline RCTime::RCTime(): RCBase() { }

inline void RCTime::Now() { gmt = PR_Now(); }
inline RCTime::operator PRTime() const { return gmt; }

inline void RCTime::operator=(PRTime his) { gmt = his; }
inline void RCTime::operator=(const RCTime& his) { gmt = his.gmt; }

inline PRBool RCTime::operator<(const RCTime& his)
    { return (gmt < his.gmt) ? PR_TRUE : PR_FALSE; }
inline PRBool RCTime::operator>(const RCTime& his)
    { return (gmt > his.gmt) ? PR_TRUE : PR_FALSE; }
inline PRBool RCTime::operator<=(const RCTime& his)
    { return (gmt <= his.gmt) ? PR_TRUE : PR_FALSE; }
inline PRBool RCTime::operator>=(const RCTime& his)
    { return (gmt >= his.gmt) ? PR_TRUE : PR_FALSE; }
inline PRBool RCTime::operator==(const RCTime& his)
    { return (gmt == his.gmt) ? PR_TRUE : PR_FALSE; }

inline RCTime& RCTime::operator+=(const RCTime& his)
    { gmt += his.gmt; return *this; }
inline RCTime& RCTime::operator-=(const RCTime& his)
    { gmt -= his.gmt; return *this; }
inline RCTime& RCTime::operator/=(PRUint64 his)
    { gmt /= his; return *this; }
inline RCTime& RCTime::operator*=(PRUint64 his)
    { gmt *= his; return *this; }

#endif /* defined(_RCTIME_H) */

/* RCTime.h */
