• Skip to content
  • Skip to link menu
KDE 4.2 API Reference
  • KDE API Reference
  • KDE-PIM Libraries
  • Sitemap
  • Contact Us
 

KCal Library

duration.cpp

Go to the documentation of this file.
00001 /*
00002     This file is part of the kcal library.
00003 
00004     Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
00005     Copyright (c) 2007 David Jarvie <software@astrojar.org.uk>
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 */
00034 #include "duration.h"
00035 
00036 #include <kdatetime.h>
00037 
00038 using namespace KCal;
00039 
00044 //@cond PRIVATE
00045 class KCal::Duration::Private
00046 {
00047   public:
00048     int seconds() const { return mDaily ? mDuration * 86400 : mDuration; }
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 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       // 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 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     // guard against integer overflow for two daily durations
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 }

KCal Library

Skip menu "KCal Library"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

KDE-PIM Libraries

Skip menu "KDE-PIM Libraries"
  • akonadi
  • kabc
  • kblog
  • kcal
  • kimap
  • kioslave
  •   imap4
  •   mbox
  • kldap
  • kmime
  • kpimidentities
  •   richtextbuilders
  • kpimutils
  • kresources
  • ktnef
  • kxmlrpcclient
  • mailtransport
  • qgpgme
  • syndication
  •   atom
  •   rdf
  •   rss2
Generated for KDE-PIM Libraries by doxygen 1.5.7.1
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal