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
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 }