This repository has been archived on 2024-12-16. You can view files and clone it, but cannot push or open issues or pull requests.
CodeBlocksPortable/Borland/BCC55/Include/Rw/collate.cc

143 lines
4.4 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef __COLLATE_CC
#define __COLLATE_CC
#pragma option push -b -a8 -pc -Vx- -Ve- -w-inl -w-aus -w-sig
/***************************************************************************
*
* collate.cc - Definitions for the Standard Library character collation facet
*
***************************************************************************
*
* Copyright (c) 1994-1999 Rogue Wave Software, Inc. All Rights Reserved.
*
* This computer software is owned by Rogue Wave Software, Inc. and is
* protected by U.S. copyright laws and other laws and by international
* treaties. This computer software is furnished by Rogue Wave Software,
* Inc. pursuant to a written license agreement and may be used, copied,
* transmitted, and stored only in accordance with the terms of such
* license and with the inclusion of the above copyright notice. This
* computer software or any other copies thereof may not be provided or
* otherwise made available to any other person.
*
* U.S. Government Restricted Rights. This computer software is provided
* with Restricted Rights. Use, duplication, or disclosure by the
* Government is subject to restrictions as set forth in subparagraph (c)
* (1) (ii) of The Rights in Technical Data and Computer Software clause
* at DFARS 252.227-7013 or subparagraphs (c) (1) and (2) of the
* Commercial Computer Software Restricted Rights at 48 CFR 52.227-19,
* as applicable. Manufacturer is Rogue Wave Software, Inc., 5500
* Flatiron Parkway, Boulder, Colorado 80301 USA.
*
**************************************************************************/
#ifndef _RWSTD_NO_NAMESPACE
namespace std {
#endif
// --------------------------------------
// Facet collate<charT> member templates.
// --------------------------------------
template <class charT>
locale::id collate<charT>::id;
template <class charT>
collate<charT>::~collate() { }
template <class charT>
int collate<charT>::do_compare
(const charT* low1, const charT* high1,
const charT* low2, const charT* high2) const
{
size_t len1=high1-low1;
size_t len2=high2-low2;
size_t len = len1 < len2 ? len1 : len2;
int comp;
for (const charT *p=low1,*q=low2; len--; p++,q++)
if ((comp=__coll_order(*p)-__coll_order(*q))!=0)
return comp<0? -1 : 1;
if (len1<len2)
return -1;
if (len2<len1)
return 1;
return 0;
}
template <class charT>
_TYPENAME collate<charT>::string_type
collate<charT>::do_transform
(const charT* low, const charT* high) const
{
string_type result(high-low,'\0');
_TYPENAME string_type::iterator out=result.begin();
for (const charT *p=low; p!=high; p++)
*out++=__coll_order(*p);
return result;
}
template <class charT>
long collate<charT>::do_hash (const charT *start, const charT *end) const
{
// We hash the result of do_transform, so that keys that transform equally
// will hash equally, per the draft.
string_type s=do_transform(start,end);
start=s.begin();
end=s.end();
// Peter Weinberger's generic hashing algorithm, adapted by Andrew Binstock
// from a version by Allen Holub (see Andrew Binstock, "Hashing Revisited",
// Dr. Dobb's Journal, April 1996) and templatized by Rogue Wave.
const int long_bits=CHAR_BIT*sizeof(long);
const int one_eighth=long_bits/8;
const int three_fourths=long_bits*3/4;
const int high_bits=(int)((~0L) << (long_bits-one_eighth));
long result=0;
for (const charT *p=start; start<end; start++) {
result=(result << one_eighth) + *p;
long temp=result & high_bits;
if (temp)
result=(result^(temp>>three_fourths)) &~ high_bits;
}
return result;
}
// --------------------------------------------------------------------
// Character collation by-name member templates: collate_byname<charT>
// --------------------------------------------------------------------
template <class charT>
collate_byname<charT>::collate_byname (const char* /*name*/, size_t refs):
collate<charT>(refs)
{ }
template <class charT>
collate_byname<charT>::~collate_byname()
{ }
template <class charT>
int collate_byname<charT>::do_compare
(const charT* /*low1*/, const charT* /*high1*/,
const charT* /*low2*/, const charT* /*high2*/) const
{
return 0;
}
template <class charT>
_TYPENAME collate_byname<charT>::string_type
collate_byname<charT>::do_transform
(const charT* /*low*/, const charT* /*high*/) const
{
return string_type();
}
#ifndef _RWSTD_NO_NAMESPACE
} // namespace std
#endif
#pragma option pop
#endif /* __COLLATE_CC */