1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
|
// soundex.cpp
// Copyright (c) 2008 Michael Thomas Greer.
//
// Boost Software License - Version 1.0 - August 17th, 2003
//
// Permission is hereby granted, free of charge, to any person or organization
// obtaining a copy of the software and accompanying documentation covered by
// this license (the "Software") to use, reproduce, display, distribute,
// execute, and transmit the Software, and to prepare derivative works of the
// Software, and to permit third-parties to whom the Software is furnished to
// do so, all subject to the following:
//
// The copyright notices in the Software and this entire statement, including
// the above license grant, this restriction and the following disclaimer,
// must be included in all copies of the Software, in whole or in part, and
// all derivative works of the Software, unless such copies or derivative
// works are solely in the form of machine-executable object code generated by
// a source language processor.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
//
#include <algorithm>
#include <functional>
#include <string>
#include <cctype>
using namespace std;
//----------------------------------------------------------------------------
char f_transform( char c )
{
string consonants[ 6 ] = { "BFPV", "CGJKQSXZ", "DT", "L", "MN", "R" };
for (int i = 0; i < 6; i++)
if (consonants[ i ].find( c ) != string::npos)
return (i +1) +'0';
return c;
}
//----------------------------------------------------------------------------
string soundex( const string& s )
{
string result;
// Validate s
if (std::find_if(
s.begin(),
s.end(),
std::not1(std::ptr_fun<int,int>(std::isalpha))
)
!= s.end())
return result;
// result <-- uppercase( s )
result.resize( s.length() );
std::transform(
s.begin(),
s.end(),
result.begin(),
std::ptr_fun<int,int>(std::toupper)
);
// Convert Soundex letters to codes
std::transform(
result.begin() +1,
result.end(),
result.begin() +1,
f_transform
);
// Collapse adjacent identical digits
result.erase(
std::unique(
result.begin() +1,
result.end()
),
result.end()
);
// Remove all non-digits following the first letter
result.erase(
std::remove_if(
result.begin() +1,
result.end(),
std::not1(std::ptr_fun<int,int>(std::isdigit))
),
result.end()
);
result += "000";
result.resize( 4 );
return result;
}
// end soundex.cpp
|