KCalCore Library
duration.cpp
Go to the documentation of this file.
00001 /* 00002 This file is part of the kcalcore library. 00003 00004 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 00005 Copyright (c) 2007 David Jarvie <djarvie@kde.org> 00006 00007 This library is free software; you can redistribute it and/or 00008 modify it under the terms of the GNU Library General Public 00009 License as published by the Free Software Foundation; either 00010 version 2 of the License, or (at your option) any later version. 00011 00012 This library is distributed in the hope that it will be useful, 00013 but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00015 Library General Public License for more details. 00016 00017 You should have received a copy of the GNU Library General Public License 00018 along with this library; see the file COPYING.LIB. If not, write to 00019 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 00020 Boston, MA 02110-1301, USA. 00021 */ 00033 #include "duration.h" 00034 #include <KDateTime> 00035 00036 using namespace KCalCore; 00037 00042 //@cond PRIVATE 00043 class KCalCore::Duration::Private 00044 { 00045 public: 00046 int seconds() const { 00047 return mDaily ? mDuration * 86400 : mDuration; 00048 } 00049 int mDuration; // number of seconds or days in the duration 00050 bool mDaily; // specified in terms of days rather than seconds 00051 }; 00052 //@endcond 00053 00054 Duration::Duration() 00055 : d( new KCalCore::Duration::Private() ) 00056 { 00057 } 00058 00059 Duration::Duration( const KDateTime &start, const KDateTime &end ) 00060 : d( new KCalCore::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 KCalCore::Duration::Private() ) 00073 { 00074 if ( type == Days ) { 00075 KDateTime endSt( end.toTimeSpec( start ) ); 00076 d->mDuration = start.daysTo( endSt ); 00077 if ( d->mDuration ) { 00078 // Round down to whole number of days if necessary 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 KCalCore::Duration::Private() ) 00098 { 00099 d->mDuration = duration; 00100 d->mDaily = ( type == Days ); 00101 } 00102 00103 Duration::Duration( const Duration &duration ) 00104 : d( new KCalCore::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 // check for self assignment 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 // guard against integer overflow for two daily durations 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 // Note: daily and non-daily durations are always unequal, since a day's 00141 // duration may differ from 24 hours if it happens to span a daylight saving 00142 // time change. 00143 return d->mDuration == other.d->mDuration && 00144 d->mDaily == other.d->mDaily; 00145 } 00146 00147 Duration &Duration::operator+=( const Duration &other ) 00148 { 00149 if ( d->mDaily == other.d->mDaily ) { 00150 d->mDuration += other.d->mDuration; 00151 } else if ( d->mDaily ) { 00152 d->mDuration = d->mDuration * 86400 + other.d->mDuration; 00153 d->mDaily = false; 00154 } else { 00155 d->mDuration += other.d->mDuration + 86400; 00156 } 00157 return *this; 00158 } 00159 00160 Duration Duration::operator-() const 00161 { 00162 return Duration( -d->mDuration, ( d->mDaily ? Days : Seconds ) ); 00163 } 00164 00165 Duration &Duration::operator-=( const Duration &duration ) 00166 { 00167 return operator+=( -duration ); 00168 } 00169 00170 Duration &Duration::operator*=( int value ) 00171 { 00172 d->mDuration *= value; 00173 return *this; 00174 } 00175 00176 Duration &Duration::operator/=( int value ) 00177 { 00178 d->mDuration /= value; 00179 return *this; 00180 } 00181 00182 KDateTime Duration::end( const KDateTime &start ) const 00183 { 00184 return d->mDaily ? start.addDays( d->mDuration ) 00185 : start.addSecs( d->mDuration ); 00186 } 00187 00188 Duration::Type Duration::type() const 00189 { 00190 return d->mDaily ? Days : Seconds; 00191 } 00192 00193 bool Duration::isDaily() const 00194 { 00195 return d->mDaily; 00196 } 00197 00198 int Duration::asSeconds() const 00199 { 00200 return d->seconds(); 00201 } 00202 00203 int Duration::asDays() const 00204 { 00205 return d->mDaily ? d->mDuration : d->mDuration / 86400; 00206 } 00207 00208 int Duration::value() const 00209 { 00210 return d->mDuration; 00211 }
This file is part of the KDE documentation.
Documentation copyright © 1996-2012 The KDE developers.
Generated on Thu Aug 2 2012 15:24:11 by doxygen 1.7.5 written by Dimitri van Heesch, © 1997-2006
Documentation copyright © 1996-2012 The KDE developers.
Generated on Thu Aug 2 2012 15:24:11 by doxygen 1.7.5 written by Dimitri van Heesch, © 1997-2006
KDE's Doxygen guidelines are available online.