blob: d3c9a45d6e97683f7debd2a80bfcee4ed57b9f30 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#include "precompiled_comphelper.hxx"
#include "comphelper/anycompare.hxx"
/** === begin UNO includes === **/
#include <com/sun/star/util/Date.hpp>
#include <com/sun/star/util/Time.hpp>
#include <com/sun/star/util/DateTime.hpp>
/** === end UNO includes === **/
//......................................................................................................................
namespace comphelper
{
//......................................................................................................................
/** === begin UNO using === **/
using ::com::sun::star::uno::Reference;
using ::com::sun::star::uno::XInterface;
using ::com::sun::star::uno::UNO_QUERY;
using ::com::sun::star::uno::UNO_QUERY_THROW;
using ::com::sun::star::uno::UNO_SET_THROW;
using ::com::sun::star::uno::Exception;
using ::com::sun::star::uno::RuntimeException;
using ::com::sun::star::uno::Any;
using ::com::sun::star::uno::makeAny;
using ::com::sun::star::uno::Sequence;
using ::com::sun::star::uno::Type;
using ::com::sun::star::uno::TypeClass_CHAR;
using ::com::sun::star::uno::TypeClass_BOOLEAN;
using ::com::sun::star::uno::TypeClass_BYTE;
using ::com::sun::star::uno::TypeClass_SHORT;
using ::com::sun::star::uno::TypeClass_UNSIGNED_SHORT;
using ::com::sun::star::uno::TypeClass_LONG;
using ::com::sun::star::uno::TypeClass_UNSIGNED_LONG;
using ::com::sun::star::uno::TypeClass_HYPER;
using ::com::sun::star::uno::TypeClass_UNSIGNED_HYPER;
using ::com::sun::star::uno::TypeClass_FLOAT;
using ::com::sun::star::uno::TypeClass_DOUBLE;
using ::com::sun::star::uno::TypeClass_STRING;
using ::com::sun::star::uno::TypeClass_TYPE;
using ::com::sun::star::uno::TypeClass_ENUM;
using ::com::sun::star::uno::TypeClass_INTERFACE;
using ::com::sun::star::uno::TypeClass_STRUCT;
using ::com::sun::star::i18n::XCollator;
using ::com::sun::star::util::Date;
using ::com::sun::star::util::Time;
using ::com::sun::star::util::DateTime;
/** === end UNO using === **/
//==================================================================================================================
//= DatePredicateLess
//==================================================================================================================
class DatePredicateLess : public IKeyPredicateLess
{
public:
virtual bool isLess( ::com::sun::star::uno::Any const & _lhs, ::com::sun::star::uno::Any const & _rhs ) const
{
Date lhs, rhs;
if ( !( _lhs >>= lhs )
|| !( _rhs >>= rhs )
)
throw ::com::sun::star::lang::IllegalArgumentException();
if ( lhs.Year < rhs.Year )
return true;
if ( lhs.Year > rhs.Year )
return false;
if ( lhs.Month < rhs.Month )
return true;
if ( lhs.Month > rhs.Month )
return false;
if ( lhs.Day < rhs.Day )
return true;
return false;
}
};
//==================================================================================================================
//= TimePredicateLess
//==================================================================================================================
class TimePredicateLess : public IKeyPredicateLess
{
public:
virtual bool isLess( ::com::sun::star::uno::Any const & _lhs, ::com::sun::star::uno::Any const & _rhs ) const
{
Time lhs, rhs;
if ( !( _lhs >>= lhs )
|| !( _rhs >>= rhs )
)
throw ::com::sun::star::lang::IllegalArgumentException();
if ( lhs.Hours < rhs.Hours )
return true;
if ( lhs.Hours > rhs.Hours )
return false;
if ( lhs.Minutes < rhs.Minutes )
return true;
if ( lhs.Minutes > rhs.Minutes )
return false;
if ( lhs.Seconds < rhs.Seconds )
return true;
if ( lhs.Seconds > rhs.Seconds )
return false;
if ( lhs.HundredthSeconds < rhs.HundredthSeconds )
return true;
return false;
}
};
//==================================================================================================================
//= DateTimePredicateLess
//==================================================================================================================
class DateTimePredicateLess : public IKeyPredicateLess
{
public:
virtual bool isLess( ::com::sun::star::uno::Any const & _lhs, ::com::sun::star::uno::Any const & _rhs ) const
{
DateTime lhs, rhs;
if ( !( _lhs >>= lhs )
|| !( _rhs >>= rhs )
)
throw ::com::sun::star::lang::IllegalArgumentException();
if ( lhs.Year < rhs.Year )
return true;
if ( lhs.Year > rhs.Year )
return false;
if ( lhs.Month < rhs.Month )
return true;
if ( lhs.Month > rhs.Month )
return false;
if ( lhs.Day < rhs.Day )
return true;
if ( lhs.Day > rhs.Day )
return false;
if ( lhs.Hours < rhs.Hours )
return true;
if ( lhs.Hours > rhs.Hours )
return false;
if ( lhs.Minutes < rhs.Minutes )
return true;
if ( lhs.Minutes > rhs.Minutes )
return false;
if ( lhs.Seconds < rhs.Seconds )
return true;
if ( lhs.Seconds > rhs.Seconds )
return false;
if ( lhs.HundredthSeconds < rhs.HundredthSeconds )
return true;
return false;
}
};
//------------------------------------------------------------------------------------------------------------------
::std::auto_ptr< IKeyPredicateLess > getStandardLessPredicate( Type const & i_type, Reference< XCollator > const & i_collator )
{
::std::auto_ptr< IKeyPredicateLess > pComparator;
switch ( i_type.getTypeClass() )
{
case TypeClass_CHAR:
pComparator.reset( new ScalarPredicateLess< sal_Unicode >() );
break;
case TypeClass_BOOLEAN:
pComparator.reset( new ScalarPredicateLess< sal_Bool >() );
break;
case TypeClass_BYTE:
pComparator.reset( new ScalarPredicateLess< sal_Int8 >() );
break;
case TypeClass_SHORT:
pComparator.reset( new ScalarPredicateLess< sal_Int16 >() );
break;
case TypeClass_UNSIGNED_SHORT:
pComparator.reset( new ScalarPredicateLess< sal_uInt16 >() );
break;
case TypeClass_LONG:
pComparator.reset( new ScalarPredicateLess< sal_Int32 >() );
break;
case TypeClass_UNSIGNED_LONG:
pComparator.reset( new ScalarPredicateLess< sal_uInt32 >() );
break;
case TypeClass_HYPER:
pComparator.reset( new ScalarPredicateLess< sal_Int64 >() );
break;
case TypeClass_UNSIGNED_HYPER:
pComparator.reset( new ScalarPredicateLess< sal_uInt64 >() );
break;
case TypeClass_FLOAT:
pComparator.reset( new ScalarPredicateLess< float >() );
break;
case TypeClass_DOUBLE:
pComparator.reset( new ScalarPredicateLess< double >() );
break;
case TypeClass_STRING:
if ( i_collator.is() )
pComparator.reset( new StringCollationPredicateLess( i_collator ) );
else
pComparator.reset( new StringPredicateLess() );
break;
case TypeClass_TYPE:
pComparator.reset( new TypePredicateLess() );
break;
case TypeClass_ENUM:
pComparator.reset( new EnumPredicateLess( i_type ) );
break;
case TypeClass_INTERFACE:
pComparator.reset( new InterfacePredicateLess() );
break;
case TypeClass_STRUCT:
if ( i_type.equals( ::cppu::UnoType< Date >::get() ) )
pComparator.reset( new DatePredicateLess() );
else if ( i_type.equals( ::cppu::UnoType< Time >::get() ) )
pComparator.reset( new TimePredicateLess() );
else if ( i_type.equals( ::cppu::UnoType< DateTime >::get() ) )
pComparator.reset( new DateTimePredicateLess() );
break;
default:
break;
}
return pComparator;
}
//......................................................................................................................
} // namespace comphelper
//......................................................................................................................