Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members

Time.cc

Go to the documentation of this file.
00001 /*
00002  * Time.cc
00003  *
00004  * Smalltalk like class library for C++
00005  * Time manipulation.
00006  *
00007  * Copyright (c) 2005 Milan Cermak
00008  */
00009 /*
00010  * This library is free software; you can redistribute it and/or
00011  * modify it under the terms of the GNU Lesser General Public
00012  * License as published by the Free Software Foundation; either
00013  * version 2.1 of the License, or (at your option) any later version.
00014  *
00015  * This library is distributed in the hope that it will be useful,
00016  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00017  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00018  * Lesser General Public License for more details.
00019  *
00020  * You should have received a copy of the GNU Lesser General Public
00021  * License along with this library; if not, write to the Free Software
00022  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00023  */
00024 #include <stdlib.h>
00025 #include <time.h>
00026 #include <sys/time.h>
00027 #include <stlib/String.h>
00028 #include <stlib/Stream.h>
00029 #include <stlib/Time.h>
00030 
00031 Time::Time(int hour, int minute, int second, int milli)
00032 {
00033     _hours = hour;
00034     _minutes = minute;
00035     _seconds = second;
00036     _milliseconds = milli;
00037 }
00038 
00039 /* Class-accessing protocol */
00040 String *Time::className(void) const
00041 {
00042     return new String("Time");
00043 }
00044 
00045 /* Instance creating protocol */
00047 Time *Time::now()
00048 {
00049     struct timeval timestamp;
00050     struct timezone tz;
00051 
00052     gettimeofday(&timestamp, &tz);
00053     const struct tm* time = localtime(&timestamp.tv_sec);
00054     return new Time(time->tm_hour, time->tm_min, time->tm_sec,
00055                     timestamp.tv_usec/1000);
00056 }
00057 
00059 Time *Time::midnight()
00060 {
00061     return Time::zero();
00062 }
00063 
00064 Time *Time::zero()
00065 {
00066     return new Time;
00067 }
00068 
00069 /* Accessing protocol */
00070 int Time::hour(void) const
00071 {
00072     return _hours;
00073 }
00074 
00075 int Time::minute(void) const
00076 {
00077     return _minutes;
00078 }
00079 
00080 int Time::second(void) const
00081 {
00082     return _seconds;
00083 }
00084 
00085 int Time::millisecond(void) const
00086 {
00087     return _milliseconds;
00088 }
00089 
00090 /* Arithmetics protocol */
00092 Time *Time::addHours(int hours)
00093 {
00094     return new Time(_hours + hours, _minutes, _seconds, _milliseconds);
00095 }
00096 
00098 Time *Time::addMinutes(int minutes)
00099 {
00100     return addSeconds(minutes * 60);
00101 }
00102 
00104 Time *Time::addSeconds(int seconds)
00105 {
00106     return addMilliseconds(seconds * 1000);
00107 }
00108 
00112 Time *Time::addMilliseconds(int millis)
00113 {
00114     int hours, minutes, seconds;
00115     millis += _milliseconds;
00116     seconds = _seconds + millis / 1000;
00117     minutes = _minutes + seconds / 60;
00118     hours = _hours + minutes / 60;
00119     minutes = minutes % 60;
00120     seconds = seconds % 60;
00121     millis = millis % 1000;
00122     return new Time(hours, minutes, seconds, millis);
00123 }
00124 
00125 Time *Time::subtractHours(int hours)
00126 {
00127     return new Time(_hours - hours, _minutes, _seconds, _milliseconds);
00128 }
00129 
00130 Time *Time::subtractMinutes(int minutes)
00131 {
00132     return subtractSeconds(minutes * 60);
00133 }
00134 
00135 Time *Time::subtractSeconds(int seconds)
00136 {
00137     return subtractMilliseconds(seconds * 1000);
00138 }
00139 
00140 Time *Time::subtractMilliseconds(int millis)
00141 {
00142     int seconds = millis / 1000;
00143     millis = _milliseconds - millis % 1000;
00144     while (millis < 1000) {
00145         seconds++; millis -= 1000;
00146     }
00147     int minutes = seconds / 60;
00148     seconds = _seconds - seconds % 60;
00149     while (seconds < 60) {
00150         minutes++; seconds -= 60;
00151     }
00152     int hours = minutes / 60;
00153     minutes = _minutes - minutes % 60;
00154     while (minutes < 60) {
00155         hours++; minutes -= 60;
00156     }
00157     hours = _hours - hours;
00158     return new Time(hours, minutes, seconds, millis);
00159 }
00160 
00161 Time *Time::differenceFrom(Time *time)
00162 {
00163     unsigned long millis = abs(asMilliseconds() - time->asMilliseconds());
00164     return Time::zero()->addMilliseconds(millis);
00165 }
00166 
00167 /* Comparing protocol */
00168 long Time::hash(void) const
00169 {
00170     long hashVal = _hours;
00171     hashVal += _minutes << 10;
00172     hashVal += _seconds << 16;
00173     hashVal += _milliseconds << 22;
00174 }
00175 
00176 bool Time::isEqual(const Object *object) const
00177 {
00178     if (!object->className()->isEqual(className())) return false;
00179 
00180     const Time *t = dynamic_cast<const Time *>(object);
00181     return t->_hours == this->_hours &&
00182            t->_minutes == this->_minutes &&
00183            t->_seconds == this->_seconds &&
00184            t->_milliseconds == this->_milliseconds;
00185 }
00186 
00187 /* Converting protocol */
00188 unsigned long Time::asMilliseconds(void) const
00189 {
00190     return ((_hours * 60 + _minutes) * 60 + _seconds) * 1000 + _milliseconds;
00191 }
00192 
00193 /* Printing protocol */
00194 void Time::printOn(Stream *stream) const
00195 {
00196     String *timeStr;
00197     timeStr = String::format("%u:%02u:%02u.%03u",
00198                              hour(), minute(), second(), millisecond());
00199     stream->nextPutAll(timeStr);
00200 }

Generated on Mon Nov 27 09:47:56 2006 for Smalltalk like C++ Class Library by  doxygen 1.4.2