KCal Library
duration.cpp
Go 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 *d = *duration.d;
00116 return *this;
00117 }
00118
00119 Duration::operator bool() const
00120 {
00121 return d->mDuration;
00122 }
00123
00124 bool Duration::operator<( const Duration &other ) const
00125 {
00126 if ( d->mDaily == other.d->mDaily ) {
00127
00128 return d->mDuration < other.d->mDuration;
00129 }
00130 return d->seconds() < other.d->seconds();
00131 }
00132
00133 bool Duration::operator==( const Duration &other ) const
00134 {
00135 return
00136 d->mDuration == other.d->mDuration &&
00137 d->mDaily == other.d->mDaily;
00138 }
00139
00140 Duration &Duration::operator+=( const Duration &other )
00141 {
00142 if ( d->mDaily == other.d->mDaily ) {
00143 d->mDuration += other.d->mDuration;
00144 } else if ( d->mDaily ) {
00145 d->mDuration = d->mDuration * 86400 + other.d->mDuration;
00146 d->mDaily = false;
00147 } else {
00148 d->mDuration += other.d->mDuration + 86400;
00149 }
00150 return *this;
00151 }
00152
00153 Duration Duration::operator-() const
00154 {
00155 return Duration( -d->mDuration, ( d->mDaily ? Days : Seconds ) );
00156 }
00157
00158 Duration &Duration::operator-=( const Duration &duration )
00159 {
00160 return operator+=( -duration );
00161 }
00162
00163 Duration &Duration::operator*=( int value )
00164 {
00165 d->mDuration *= value;
00166 return *this;
00167 }
00168
00169 Duration &Duration::operator/=( int value )
00170 {
00171 d->mDuration /= value;
00172 return *this;
00173 }
00174
00175 KDateTime Duration::end( const KDateTime &start ) const
00176 {
00177 return d->mDaily ? start.addDays( d->mDuration )
00178 : start.addSecs( d->mDuration );
00179 }
00180
00181 Duration::Type Duration::type() const
00182 {
00183 return d->mDaily ? Days : Seconds;
00184 }
00185
00186 bool Duration::isDaily() const
00187 {
00188 return d->mDaily;
00189 }
00190
00191 int Duration::asSeconds() const
00192 {
00193 return d->seconds();
00194 }
00195
00196 int Duration::asDays() const
00197 {
00198 return d->mDaily ? d->mDuration : d->mDuration / 86400;
00199 }
00200
00201 int Duration::value() const
00202 {
00203 return d->mDuration;
00204 }