view liboctave/system/oct-time.h @ 17769:49a5a4be04a1

maint: Use GNU style coding conventions for code in liboctave/ * liboctave/array/Array-C.cc, liboctave/array/Array-b.cc, liboctave/array/Array-ch.cc, liboctave/array/Array-d.cc, liboctave/array/Array-f.cc, liboctave/array/Array-fC.cc, liboctave/array/Array-util.cc, liboctave/array/Array-util.h, liboctave/array/Array.cc, liboctave/array/Array.h, liboctave/array/Array3.h, liboctave/array/CColVector.cc, liboctave/array/CColVector.h, liboctave/array/CDiagMatrix.cc, liboctave/array/CDiagMatrix.h, liboctave/array/CMatrix.cc, liboctave/array/CMatrix.h, liboctave/array/CNDArray.cc, liboctave/array/CNDArray.h, liboctave/array/CRowVector.cc, liboctave/array/CRowVector.h, liboctave/array/CSparse.cc, liboctave/array/CSparse.h, liboctave/array/DiagArray2.h, liboctave/array/MArray.cc, liboctave/array/MArray.h, liboctave/array/MDiagArray2.cc, liboctave/array/MDiagArray2.h, liboctave/array/MSparse.cc, liboctave/array/MSparse.h, liboctave/array/MatrixType.cc, liboctave/array/MatrixType.h, liboctave/array/PermMatrix.h, liboctave/array/Range.cc, liboctave/array/Range.h, liboctave/array/Sparse.cc, liboctave/array/Sparse.h, liboctave/array/boolMatrix.cc, liboctave/array/boolMatrix.h, liboctave/array/boolNDArray.cc, liboctave/array/boolNDArray.h, liboctave/array/boolSparse.cc, liboctave/array/boolSparse.h, liboctave/array/chMatrix.cc, liboctave/array/chMatrix.h, liboctave/array/chNDArray.cc, liboctave/array/chNDArray.h, liboctave/array/dColVector.h, liboctave/array/dDiagMatrix.cc, liboctave/array/dDiagMatrix.h, liboctave/array/dMatrix.cc, liboctave/array/dMatrix.h, liboctave/array/dNDArray.cc, liboctave/array/dNDArray.h, liboctave/array/dRowVector.h, liboctave/array/dSparse.cc, liboctave/array/dSparse.h, liboctave/array/dim-vector.cc, liboctave/array/dim-vector.h, liboctave/array/fCColVector.cc, liboctave/array/fCColVector.h, liboctave/array/fCDiagMatrix.cc, liboctave/array/fCDiagMatrix.h, liboctave/array/fCMatrix.cc, liboctave/array/fCMatrix.h, liboctave/array/fCNDArray.cc, liboctave/array/fCNDArray.h, liboctave/array/fCRowVector.cc, liboctave/array/fCRowVector.h, liboctave/array/fColVector.h, liboctave/array/fDiagMatrix.cc, liboctave/array/fDiagMatrix.h, liboctave/array/fMatrix.cc, liboctave/array/fMatrix.h, liboctave/array/fNDArray.cc, liboctave/array/fNDArray.h, liboctave/array/fRowVector.h, liboctave/array/idx-vector.cc, liboctave/array/idx-vector.h, liboctave/array/intNDArray.cc, liboctave/array/intNDArray.h, liboctave/cruft/misc/blaswrap.c, liboctave/cruft/misc/quit.cc, liboctave/numeric/CmplxCHOL.cc, liboctave/numeric/CmplxCHOL.h, liboctave/numeric/CmplxGEPBAL.cc, liboctave/numeric/CmplxGEPBAL.h, liboctave/numeric/CmplxHESS.h, liboctave/numeric/CmplxLU.cc, liboctave/numeric/CmplxLU.h, liboctave/numeric/CmplxQR.cc, liboctave/numeric/CmplxQRP.cc, liboctave/numeric/CmplxQRP.h, liboctave/numeric/CmplxSCHUR.h, liboctave/numeric/CmplxSVD.cc, liboctave/numeric/CmplxSVD.h, liboctave/numeric/CollocWt.h, liboctave/numeric/DAE.h, liboctave/numeric/DAEFunc.h, liboctave/numeric/DAERT.h, liboctave/numeric/DAERTFunc.h, liboctave/numeric/DASPK.cc, liboctave/numeric/DASRT.cc, liboctave/numeric/DASRT.h, liboctave/numeric/DASSL.cc, liboctave/numeric/DET.h, liboctave/numeric/EIG.cc, liboctave/numeric/EIG.h, liboctave/numeric/LSODE.cc, liboctave/numeric/ODE.h, liboctave/numeric/ODEFunc.h, liboctave/numeric/ODES.h, liboctave/numeric/ODESFunc.h, liboctave/numeric/Quad.cc, liboctave/numeric/Quad.h, liboctave/numeric/SparseCmplxCHOL.h, liboctave/numeric/SparseCmplxLU.cc, liboctave/numeric/SparseCmplxLU.h, liboctave/numeric/SparseCmplxQR.cc, liboctave/numeric/SparseCmplxQR.h, liboctave/numeric/SparseQR.cc, liboctave/numeric/SparseQR.h, liboctave/numeric/SparsedbleCHOL.h, liboctave/numeric/SparsedbleLU.cc, liboctave/numeric/SparsedbleLU.h, liboctave/numeric/base-aepbal.h, liboctave/numeric/base-dae.h, liboctave/numeric/base-de.h, liboctave/numeric/base-lu.cc, liboctave/numeric/base-lu.h, liboctave/numeric/base-min.h, liboctave/numeric/base-qr.h, liboctave/numeric/bsxfun.h, liboctave/numeric/dbleCHOL.cc, liboctave/numeric/dbleCHOL.h, liboctave/numeric/dbleGEPBAL.h, liboctave/numeric/dbleHESS.h, liboctave/numeric/dbleLU.cc, liboctave/numeric/dbleLU.h, liboctave/numeric/dbleQR.cc, liboctave/numeric/dbleQRP.cc, liboctave/numeric/dbleQRP.h, liboctave/numeric/dbleSCHUR.cc, liboctave/numeric/dbleSCHUR.h, liboctave/numeric/dbleSVD.cc, liboctave/numeric/dbleSVD.h, liboctave/numeric/eigs-base.cc, liboctave/numeric/fCmplxAEPBAL.cc, liboctave/numeric/fCmplxAEPBAL.h, liboctave/numeric/fCmplxCHOL.cc, liboctave/numeric/fCmplxCHOL.h, liboctave/numeric/fCmplxGEPBAL.cc, liboctave/numeric/fCmplxGEPBAL.h, liboctave/numeric/fCmplxHESS.h, liboctave/numeric/fCmplxLU.cc, liboctave/numeric/fCmplxLU.h, liboctave/numeric/fCmplxQR.cc, liboctave/numeric/fCmplxQR.h, liboctave/numeric/fCmplxQRP.cc, liboctave/numeric/fCmplxQRP.h, liboctave/numeric/fCmplxSCHUR.cc, liboctave/numeric/fCmplxSCHUR.h, liboctave/numeric/fCmplxSVD.h, liboctave/numeric/fEIG.cc, liboctave/numeric/fEIG.h, liboctave/numeric/floatCHOL.cc, liboctave/numeric/floatCHOL.h, liboctave/numeric/floatGEPBAL.cc, liboctave/numeric/floatGEPBAL.h, liboctave/numeric/floatHESS.h, liboctave/numeric/floatLU.cc, liboctave/numeric/floatLU.h, liboctave/numeric/floatQR.cc, liboctave/numeric/floatQRP.cc, liboctave/numeric/floatQRP.h, liboctave/numeric/floatSCHUR.cc, liboctave/numeric/floatSCHUR.h, liboctave/numeric/floatSVD.cc, liboctave/numeric/floatSVD.h, liboctave/numeric/lo-mappers.cc, liboctave/numeric/lo-mappers.h, liboctave/numeric/lo-specfun.cc, liboctave/numeric/lo-specfun.h, liboctave/numeric/oct-convn.cc, liboctave/numeric/oct-fftw.cc, liboctave/numeric/oct-fftw.h, liboctave/numeric/oct-norm.cc, liboctave/numeric/oct-rand.cc, liboctave/numeric/oct-rand.h, liboctave/numeric/randgamma.c, liboctave/numeric/randgamma.h, liboctave/numeric/randmtzig.c, liboctave/numeric/randpoisson.c, liboctave/numeric/randpoisson.h, liboctave/numeric/sparse-base-chol.h, liboctave/numeric/sparse-base-lu.h, liboctave/numeric/sparse-dmsolve.cc, liboctave/operators/Sparse-diag-op-defs.h, liboctave/operators/Sparse-op-defs.h, liboctave/operators/mx-inlines.cc, liboctave/system/dir-ops.h, liboctave/system/file-ops.cc, liboctave/system/file-stat.cc, liboctave/system/file-stat.h, liboctave/system/lo-sysdep.cc, liboctave/system/lo-sysdep.h, liboctave/system/mach-info.cc, liboctave/system/mach-info.h, liboctave/system/oct-env.cc, liboctave/system/oct-group.cc, liboctave/system/oct-syscalls.cc, liboctave/system/oct-syscalls.h, liboctave/system/oct-time.h, liboctave/system/tempname.c, liboctave/util/action-container.h, liboctave/util/base-list.h, liboctave/util/cmd-edit.cc, liboctave/util/cmd-edit.h, liboctave/util/cmd-hist.cc, liboctave/util/cmd-hist.h, liboctave/util/data-conv.cc, liboctave/util/data-conv.h, liboctave/util/kpse.cc, liboctave/util/lo-array-gripes.cc, liboctave/util/lo-cieee.c, liboctave/util/lo-regexp.cc, liboctave/util/lo-utils.cc, liboctave/util/oct-alloc.cc, liboctave/util/oct-base64.cc, liboctave/util/oct-binmap.h, liboctave/util/oct-cmplx.h, liboctave/util/oct-glob.cc, liboctave/util/oct-inttypes.cc, liboctave/util/oct-inttypes.h, liboctave/util/oct-locbuf.cc, liboctave/util/oct-locbuf.h, liboctave/util/oct-mem.h, liboctave/util/oct-mutex.cc, liboctave/util/oct-refcount.h, liboctave/util/oct-shlib.cc, liboctave/util/oct-shlib.h, liboctave/util/oct-sort.cc, liboctave/util/oct-sort.h, liboctave/util/pathsearch.cc, liboctave/util/pathsearch.h, liboctave/util/sparse-util.cc, liboctave/util/str-vec.cc, liboctave/util/str-vec.h, liboctave/util/unwind-prot.h, liboctave/util/url-transfer.cc, liboctave/util/url-transfer.h: Use GNU style coding conventions.
author Rik <rik@octave.org>
date Sat, 26 Oct 2013 18:57:05 -0700
parents d63878346099
children ebb3ef964372
line wrap: on
line source

/*

Copyright (C) 1999-2013 John W. Eaton

This file is part of Octave.

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

Octave 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 General Public License
for more details.

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

*/

#if !defined (octave_time_h)
#define octave_time_h 1

#include <ctime>
#include <string>

#include "lo-math.h"

class octave_base_tm;

class
OCTAVE_API
octave_time
{
public:

  octave_time (void)
    : ot_unix_time (0), ot_usec (0) { stamp (); }

  octave_time (time_t t)
    : ot_unix_time (t), ot_usec (0) { }

  octave_time (time_t t, int us)
    : ot_unix_time (t), ot_usec ()
  {
    int rem, extra;

    if (us >= 0)
      {
        rem = us % 1000000;
        extra = (us - rem) / 1000000;
      }
    else
      {
        us = -us;
        rem = us % 1000000;
        extra = - (1 + (us - rem) / 1000000);
        rem = 1000000 - us % 1000000;
      }

    ot_usec = rem;
    ot_unix_time += extra;
  }

  octave_time (double d)
    : ot_unix_time (static_cast<time_t> (d)), ot_usec (0)
  {
    double ip;
    ot_usec = static_cast<int> (std::modf (d, &ip) * 1e6);
  }

  octave_time (const octave_base_tm& tm);

  octave_time (const octave_time& ot)
    : ot_unix_time (ot.ot_unix_time), ot_usec (ot.ot_usec) { }

  octave_time& operator = (const octave_time& ot)
  {
    if (this != &ot)
      {
        ot_unix_time = ot.ot_unix_time;
        ot_usec = ot.ot_usec;
      }

    return *this;
  }

  ~octave_time (void) { }

  void stamp (void);

  double double_value (void) const { return ot_unix_time + ot_usec / 1e6; }

  time_t unix_time (void) const { return ot_unix_time; }

  int usec (void) const { return ot_usec; }

  std::string ctime (void) const;

private:

  // Seconds since the epoch.
  time_t ot_unix_time;

  // Additional microseconds.
  int ot_usec;
};

inline bool
operator == (const octave_time& t1, const octave_time& t2)
{
  return (t1.unix_time () == t2.unix_time () && t1.usec () == t2.usec ());
}

inline bool
operator != (const octave_time& t1, const octave_time& t2)
{
  return ! (t1 == t2);
}

inline bool
operator < (const octave_time& t1, const octave_time& t2)
{
  if (t1.unix_time () < t2.unix_time ())
    return true;
  else if (t1.unix_time () > t2.unix_time ())
    return false;
  else if (t1.usec () < t2.usec ())
    return true;
  else
    return false;
}

inline bool
operator <= (const octave_time& t1, const octave_time& t2)
{
  return (t1 < t2 || t1 == t2);
}

inline bool
operator > (const octave_time& t1, const octave_time& t2)
{
  if (t1.unix_time () > t2.unix_time ())
    return true;
  else if (t1.unix_time () < t2.unix_time ())
    return false;
  else if (t1.usec () > t2.usec ())
    return true;
  else
    return false;
}

inline bool
operator >= (const octave_time& t1, const octave_time& t2)
{
  return (t1 > t2 || t1 == t2);
}

inline octave_time
operator + (const octave_time& t1, const octave_time& t2)
{
  return octave_time (t1.unix_time () + t2.unix_time (),
                      t1.usec () + t2.usec ());
}

class
OCTAVE_API
octave_base_tm
{
public:

  octave_base_tm (void)
    : tm_usec (0), tm_sec (0), tm_min (0), tm_hour (0),
      tm_mday (0), tm_mon (0), tm_year (0), tm_wday (0),
      tm_yday (0), tm_isdst (0), tm_gmtoff (0), tm_zone ("unknown")
  { }

  octave_base_tm (const octave_base_tm& tm)
    : tm_usec (tm.tm_usec), tm_sec (tm.tm_sec), tm_min (tm.tm_min),
      tm_hour (tm.tm_hour), tm_mday (tm.tm_mday), tm_mon (tm.tm_mon),
      tm_year (tm.tm_year), tm_wday (tm.tm_wday), tm_yday (tm.tm_yday),
      tm_isdst (tm.tm_isdst), tm_gmtoff (tm.tm_gmtoff), tm_zone (tm.tm_zone)
  { }

  octave_base_tm& operator = (const octave_base_tm& tm)
  {
    if (this != &tm)
      {
        tm_usec = tm.tm_usec;
        tm_sec = tm.tm_sec;
        tm_min = tm.tm_min;
        tm_hour = tm.tm_hour;
        tm_mday = tm.tm_mday;
        tm_mon = tm.tm_mon;
        tm_year = tm.tm_year;
        tm_wday = tm.tm_wday;
        tm_yday = tm.tm_yday;
        tm_isdst = tm.tm_isdst;
        tm_gmtoff = tm.tm_gmtoff;
        tm_zone = tm.tm_zone;
      }

    return *this;
  }

  virtual ~octave_base_tm (void) { }

  int usec (void) const { return tm_usec; }
  int sec (void) const { return tm_sec; }
  int min (void) const { return tm_min; }
  int hour (void) const { return tm_hour; }
  int mday (void) const { return tm_mday; }
  int mon (void) const { return tm_mon; }
  int year (void) const { return tm_year; }
  int wday (void) const { return tm_wday; }
  int yday (void) const { return tm_yday; }
  int isdst (void) const { return tm_isdst; }
  long gmtoff (void) const { return tm_gmtoff; }
  std::string zone (void) const { return tm_zone; }

  octave_base_tm& usec (int v);
  octave_base_tm& sec (int v);
  octave_base_tm& min (int v);
  octave_base_tm& hour (int v);
  octave_base_tm& mday (int v);
  octave_base_tm& mon (int v);
  octave_base_tm& year (int v);
  octave_base_tm& wday (int v);
  octave_base_tm& yday (int v);
  octave_base_tm& isdst (int v);
  octave_base_tm& gmtoff (long v);
  octave_base_tm& zone (const std::string& s);

  std::string strftime (const std::string& fmt) const;

  std::string asctime (void) const
  { return strftime ("%a %b %d %H:%M:%S %Y\n"); }

protected:

  // Microseconds after the second (0, 999999).
  int tm_usec;

  // Seconds after the minute (0, 61).
  int tm_sec;

  // Minutes after the hour (0, 59).
  int tm_min;

  // Hours since midnight (0, 23).
  int tm_hour;

  // Day of the month (1, 31).
  int tm_mday;

  // Months since January (0, 11).
  int tm_mon;

  // Years since 1900.
  int tm_year;

  // Days since Sunday (0, 6).
  int tm_wday;

  // Days since January 1 (0, 365).
  int tm_yday;

  // Daylight Savings Time flag.
  int tm_isdst;

  // Time zone.
  long tm_gmtoff;

  // Time zone.
  std::string tm_zone;

  void init (void *p);
};

class
OCTAVE_API
octave_localtime : public octave_base_tm
{
public:

  octave_localtime (void)
    : octave_base_tm () { init (octave_time ()); }

  octave_localtime (const octave_time& ot)
    : octave_base_tm () { init (ot); }

  octave_localtime (const octave_localtime& t)
    : octave_base_tm (t) { }

  octave_localtime& operator = (const octave_localtime& t)
  {
    octave_base_tm::operator = (t);
    return *this;
  }

  ~octave_localtime (void) { }

private:

  void init (const octave_time& ot);
};

class
OCTAVE_API
octave_gmtime : public octave_base_tm
{
public:

  octave_gmtime (void)
    : octave_base_tm () { init (octave_time ()); }

  octave_gmtime (const octave_time& ot)
    : octave_base_tm () { init (ot); }

  octave_gmtime& operator = (const octave_gmtime& t)
  {
    octave_base_tm::operator = (t);
    return *this;
  }

  ~octave_gmtime (void) { }

private:

  void init (const octave_time& ot);
};

class
OCTAVE_API
octave_strptime : public octave_base_tm
{
public:

  octave_strptime (const std::string& str, const std::string& fmt)
    : octave_base_tm (), nchars (0)
  {
    init (str, fmt);
  }

  octave_strptime (const octave_strptime& s)
    : octave_base_tm (s), nchars (s.nchars) { }

  octave_strptime& operator = (const octave_strptime& s)
  {
    octave_base_tm::operator = (s);
    nchars = s.nchars;
    return *this;
  }

  int characters_converted (void) const { return nchars; }

  ~octave_strptime (void) { }

private:

  int nchars;

  void init (const std::string& str, const std::string& fmt);
};

#endif