• Skip to content
  • Skip to link menu
  • KDE API Reference
  • kdepimlibs-4.8.3 API Reference
  • KDE Home
  • Contact Us
 

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 May 10 2012 22:16:56 by doxygen 1.8.0 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

KCalCore Library

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

kdepimlibs-4.8.3 API Reference

Skip menu "kdepimlibs-4.8.3 API Reference"
  • akonadi
  •   contact
  •   kmime
  • kabc
  • kalarmcal
  • kblog
  • kcal
  • kcalcore
  • kcalutils
  • kholidays
  • kimap
  • kioslave
  •   imap4
  •   mbox
  •   nntp
  • kldap
  • kmbox
  • kmime
  • kontactinterface
  • kpimidentities
  • kpimtextedit
  •   richtextbuilders
  • kpimutils
  • kresources
  • ktnef
  • kxmlrpcclient
  • mailtransport
  • microblog
  • qgpgme
  • syndication
  •   atom
  •   rdf
  •   rss2
Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal