#include <iostream>
#include <set>
// works on both `const` and non-`const` associative containers:
template < class Container>
auto my_equal_range( Container&& container, double target, double epsilon = 0.00001 )
- > decltype( container.equal_range ( target) )
{
auto lower = container.lower_bound ( target- epsilon ) ;
auto upper = container.upper_bound ( target+ epsilon ) ;
return std:: make_pair ( lower, upper) ;
}
template < typename Container>
bool orig_key_exists( Container const & container, double target, double epsilon = 0.00001 ) {
auto range = my_equal_range( container, target, epsilon) ;
return range.first == range.second ;
}
template < typename Container>
bool proposed_key_exists( Container const & container, double target, double epsilon = 0.00001 ) {
auto range = my_equal_range( container, target, epsilon) ;
return range.first ! = range.second ;
}
void test( const std:: set < double > & s, double target, bool expected_exists)
{
bool proposed = orig_key_exists( s, target) ;
std:: cout << "original test for key " << target << ": " << ( orig_key_exists( s, target) == expected_exists ? "PASS" : "FAIL" ) << std:: endl ;
std:: cout << "proposed test for key " << target << ": " << ( proposed_key_exists( s, target) == expected_exists ? "PASS" : "FAIL" ) << std:: endl ;
std:: cout << std:: endl ;
}
int main( ) {
std:: set < double > s = { 1 , 2 , 3 } ;
test( s, 2 , true ) ;
test( s, 100 , false ) ;
test( s, - 5 , false ) ;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c2V0PgoKLy8gd29ya3Mgb24gYm90aCBgY29uc3RgIGFuZCBub24tYGNvbnN0YCBhc3NvY2lhdGl2ZSBjb250YWluZXJzOgp0ZW1wbGF0ZTxjbGFzcyBDb250YWluZXI+CmF1dG8gbXlfZXF1YWxfcmFuZ2UoIENvbnRhaW5lciYmIGNvbnRhaW5lciwgZG91YmxlIHRhcmdldCwgZG91YmxlIGVwc2lsb24gPSAwLjAwMDAxICkKLT4gZGVjbHR5cGUoIGNvbnRhaW5lci5lcXVhbF9yYW5nZSh0YXJnZXQpICkKewogIGF1dG8gbG93ZXIgPSBjb250YWluZXIubG93ZXJfYm91bmQoIHRhcmdldC1lcHNpbG9uICk7CiAgYXV0byB1cHBlciA9IGNvbnRhaW5lci51cHBlcl9ib3VuZCggdGFyZ2V0K2Vwc2lsb24gKTsKICByZXR1cm4gc3RkOjptYWtlX3BhaXIobG93ZXIsIHVwcGVyKTsKfQoKdGVtcGxhdGU8dHlwZW5hbWUgQ29udGFpbmVyPgpib29sIG9yaWdfa2V5X2V4aXN0cyggQ29udGFpbmVyIGNvbnN0JiBjb250YWluZXIsIGRvdWJsZSB0YXJnZXQsIGRvdWJsZSBlcHNpbG9uID0gMC4wMDAwMSApIHsKICBhdXRvIHJhbmdlID0gbXlfZXF1YWxfcmFuZ2UoY29udGFpbmVyLCB0YXJnZXQsIGVwc2lsb24pOwogIHJldHVybiByYW5nZS5maXJzdCA9PSByYW5nZS5zZWNvbmQ7Cn0KCnRlbXBsYXRlPHR5cGVuYW1lIENvbnRhaW5lcj4KYm9vbCBwcm9wb3NlZF9rZXlfZXhpc3RzKCBDb250YWluZXIgY29uc3QmIGNvbnRhaW5lciwgZG91YmxlIHRhcmdldCwgZG91YmxlIGVwc2lsb24gPSAwLjAwMDAxICkgewogIGF1dG8gcmFuZ2UgPSBteV9lcXVhbF9yYW5nZShjb250YWluZXIsIHRhcmdldCwgZXBzaWxvbik7CiAgcmV0dXJuIHJhbmdlLmZpcnN0ICE9IHJhbmdlLnNlY29uZDsKfQoKdm9pZCB0ZXN0KGNvbnN0IHN0ZDo6c2V0PGRvdWJsZT4mIHMsIGRvdWJsZSB0YXJnZXQsIGJvb2wgZXhwZWN0ZWRfZXhpc3RzKQp7Cglib29sIHByb3Bvc2VkID0gb3JpZ19rZXlfZXhpc3RzKHMsIHRhcmdldCk7CglzdGQ6OmNvdXQgPDwgIm9yaWdpbmFsIHRlc3QgZm9yIGtleSAiIDw8IHRhcmdldCA8PCAiOiAiIDw8IChvcmlnX2tleV9leGlzdHMocywgdGFyZ2V0KSA9PSBleHBlY3RlZF9leGlzdHMgPyAiUEFTUyIgOiAiRkFJTCIpIDw8IHN0ZDo6ZW5kbDsKCXN0ZDo6Y291dCA8PCAicHJvcG9zZWQgdGVzdCBmb3Iga2V5ICIgPDwgdGFyZ2V0IDw8ICI6ICIgPDwgKHByb3Bvc2VkX2tleV9leGlzdHMocywgdGFyZ2V0KSA9PSBleHBlY3RlZF9leGlzdHMgPyAiUEFTUyIgOiAiRkFJTCIpIDw8IHN0ZDo6ZW5kbDsKCXN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7Cn0KCmludCBtYWluKCkgewoJc3RkOjpzZXQ8ZG91YmxlPiBzID0gezEsIDIsIDN9OwoJCgl0ZXN0KHMsIDIsIHRydWUpOwoJdGVzdChzLCAxMDAsIGZhbHNlKTsKCXRlc3QocywgLTUsIGZhbHNlKTsKCQoJcmV0dXJuIDA7Cn0=