duration.cppGo to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00034 #include "duration.h"
00035
00036 #include <kdatetime.h>
00037
00038 using namespace KCal;
00039
00044
00045 class KCal::Duration::Private
00046 {
00047 public:
00048 int seconds() const { return mDaily ? mDuration * 86400 : mDuration; }
00049 int mDuration;
00050 bool mDaily;
00051 };
00052
00053
00054 Duration::Duration()
00055 : d( new KCal::Duration::Private() )
00056 {
00057 }
00058
00059 Duration::Duration( const KDateTime &start, const KDateTime &end )
00060 : d( new KCal::Duration::Private() )
00061 {
00062 if ( start.time() == end.time() && start.timeSpec() == end.timeSpec() ) {
00063 d->mDuration = start.daysTo( end );
00064 d->mDaily = true;
00065 } else {
00066 d->mDuration = start.secsTo( end );
00067 d->mDaily = false;
00068 }
00069 }
00070
00071 Duration::Duration( const KDateTime &start, const KDateTime &end, Type type )
00072 : d( new KCal::Duration::Private() )
00073 {
00074 if ( type == Days ) {
00075 KDateTime endSt( end.toTimeSpec( start ) );
00076 d->mDuration = start.daysTo( endSt );
00077 if ( d->mDuration ) {
00078
00079 if ( start < endSt ) {
00080 if ( endSt.time() < start.time() ) {
00081 --d->mDuration;
00082 }
00083 } else {
00084 if ( endSt.time() > start.time() ) {
00085 ++d->mDuration;
00086 }
00087 }
00088 }
00089 d->mDaily = true;
00090 } else {
00091 d->mDuration = start.secsTo( end );
00092 d->mDaily = false;
00093 }
00094 }
00095
00096 Duration::Duration( int duration, Type type )
00097 : d( new KCal::Duration::Private() )
00098 {
00099 d->mDuration = duration;
00100 d->mDaily = ( type == Days );
00101 }
00102
00103 Duration::Duration( const Duration &duration )
00104 : d( new KCal::Duration::Private( *duration.d ) )
00105 {
00106 }
00107
00108 Duration::~Duration()
00109 {
00110 delete d;
00111 }
00112
00113 Duration &Duration::operator=( const Duration &duration )
00114 {
00115
00116 if ( &duration == this ) {
00117 return *this;
00118 }
00119
00120 *d = *duration.d;
00121 return *this;
00122 }
00123
00124 Duration::operator bool() const
00125 {
00126 return d->mDuration;
00127 }
00128
00129 bool Duration::operator<( const Duration &other ) const
00130 {
00131 if ( d->mDaily == other.d->mDaily ) {
00132
00133 return d->mDuration < other.d->mDuration;
00134 }
00135 return d->seconds() < other.d->seconds();
00136 }
00137
00138 bool Duration::operator==( const Duration &other ) const
00139 {
00140
00141
00142
00143 return
00144 d->mDuration == other.d->mDuration &&
00145 d->mDaily == other.d->mDaily;
00146 }
00147
00148 Duration &Duration::operator+=( const Duration &other )
00149 {
00150 if ( d->mDaily == other.d->mDaily ) {
00151 d->mDuration += other.d->mDuration;
00152 } else if ( d->mDaily ) {
00153 d->mDuration = d->mDuration * 86400 + other.d->mDuration;
00154 d->mDaily = false;
00155 } else {
00156 d->mDuration += other.d->mDuration + 86400;
00157 }
00158 return *this;
00159 }
00160
00161 Duration Duration::operator-() const
00162 {
00163 return Duration( -d->mDuration, ( d->mDaily ? Days : Seconds ) );
00164 }
00165
00166 Duration &Duration::operator-=( const Duration &duration )
00167 {
00168 return operator+=( -duration );
00169 }
00170
00171 Duration &Duration::operator*=( int value )
00172 {
00173 d->mDuration *= value;
00174 return *this;
00175 }
00176
00177 Duration &Duration::operator/=( int value )
00178 {
00179 d->mDuration /= value;
00180 return *this;
00181 }
00182
00183 KDateTime Duration::end( const KDateTime &start ) const
00184 {
00185 return d->mDaily ? start.addDays( d->mDuration )
00186 : start.addSecs( d->mDuration );
00187 }
00188
00189 Duration::Type Duration::type() const
00190 {
00191 return d->mDaily ? Days : Seconds;
00192 }
00193
00194 bool Duration::isDaily() const
00195 {
00196 return d->mDaily;
00197 }
00198
00199 int Duration::asSeconds() const
00200 {
00201 return d->seconds();
00202 }
00203
00204 int Duration::asDays() const
00205 {
00206 return d->mDaily ? d->mDuration : d->mDuration / 86400;
00207 }
00208
00209 int Duration::value() const
00210 {
00211 return d->mDuration;
00212 }
|