|  | /************************************************************** | 
|  | * | 
|  | * 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 | 
|  | //...................................................................................................................... |