/* This file is part of libkcal. Copyright (c) 2001 Cornelius Schumacher This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "duration.h" using namespace KCal; Duration::Duration() { mDuration = 0; } Duration::Duration( const TQDateTime &start, const TQDateTime &end ) { if ( start.time() == end.time() ) { mDuration = start.daysTo( end ); mDaily = true; } else { mDuration = start.secsTo( end ); mDaily = false; } } Duration::Duration( const TQDateTime &start, const TQDateTime &end, Type type ) { if ( type == Days ) { mDuration = start.daysTo( end ); if ( mDuration ) { // Round down to whole number of days if necessary if ( start < end ) { if ( end.time() < start.time() ) { --mDuration; } } else { if ( end.time() > start.time() ) { ++mDuration; } } } mDaily = true; } else { mDuration = start.secsTo( end ); mDaily = false; } } Duration::Duration( int duration, Type type ) { mDuration = duration; mDaily = ( type == Days ); } Duration::Duration( const Duration &duration ) { mDuration = duration.mDuration; mDaily = duration.mDaily; } Duration &Duration::operator=( const Duration &duration ) { // check for self assignment if ( &duration == this ) { return *this; } mDuration = duration.mDuration; mDaily = duration.mDaily; return *this; } Duration::operator bool() const { return mDuration; } bool Duration::operator<( const Duration &other ) const { if ( mDaily == other.mDaily ) { // guard against integer overflow for two daily durations return mDuration < other.mDuration; } return seconds() < other.seconds(); } bool Duration::operator==( const Duration &other ) const { // Note: daily and non-daily durations are always unequal, since a day's // duration may differ from 24 hours if it happens to span a daylight saving // time change. return mDuration == other.mDuration && mDaily == other.mDaily; } Duration &Duration::operator+=( const Duration &other ) { if ( mDaily == other.mDaily ) { mDuration += other.mDuration; } else if ( mDaily ) { mDuration = mDuration * 86400 + other.mDuration; mDaily = false; } else { mDuration += other.mDuration + 86400; } return *this; } Duration Duration::operator-() const { return Duration( -mDuration, ( mDaily ? Days : Seconds ) ); } Duration &Duration::operator-=( const Duration &duration ) { return operator+=( -duration ); } Duration &Duration::operator*=( int value ) { mDuration *= value; return *this; } Duration &Duration::operator/=( int value ) { mDuration /= value; return *this; } TQDateTime Duration::end( const TQDateTime &start ) const { return mDaily ? start.addDays( mDuration ) : start.addSecs( mDuration ); } Duration::Type Duration::type() const { return mDaily ? Days : Seconds; } bool Duration::isDaily() const { return mDaily; } int Duration::asSeconds() const { return seconds(); } int Duration::asDays() const { return mDaily ? mDuration : mDuration / 86400; } int Duration::value() const { return mDuration; }