#include <iostream>
#include <vector>
#include <list>
#include <type_traits>
#include <iterator>
// Figure out if contiguous here --> template function bool is_contiguous<Type>();
// User-defined iterator
using Custom_Iterator = int * ;
template < typename Iterator>
constexpr auto is_contiguous( )
- > typename std:: enable_if < std:: is_same < Iterator,Custom_Iterator> :: value , bool > :: type
{
return true ; // change to false if not actually contiguous
}
// Simple container
template < typename Iterator>
constexpr auto is_contiguous( )
- > typename std:: enable_if < std:: is_same < Iterator,std:: string :: iterator > :: value , bool > :: type
{
return true ;
}
// STL Containers (seems to require typename = void voodoo)
template < typename Iterator, typename U = typename std:: vector < typename std:: iterator_traits < Iterator> :: value_type > :: iterator >
constexpr auto is_contiguous( )
- > typename std:: enable_if < std:: is_same < Iterator,U> :: value , bool > :: type
{
return true ;
}
template < typename Iterator, typename U = typename std:: list < typename std:: iterator_traits < Iterator> :: value_type > :: iterator , typename = void >
constexpr auto is_contiguous( )
- > typename std:: enable_if < std:: is_same < Iterator,U> :: value , bool > :: type
{
return false ;
}
// Do work here
template < typename Iterator>
auto f( Iterator beg, Iterator end)
- > typename std:: enable_if < ! is_contiguous< Iterator> ( ) , void > :: type
{
std:: cout << "Not contiguous:" ;
for ( auto it = beg; it ! = end; it = std:: next ( it) )
{
std:: cout << " " << * it;
}
std:: cout << std:: endl ;
}
template < typename Iterator>
auto f( Iterator beg, Iterator end)
- > typename std:: enable_if < is_contiguous< Iterator> ( ) , void > :: type
{
std:: cout << "Contiguous:" ;
for ( auto it = beg; it ! = end; it = std:: next ( it) )
{
std:: cout << " " << * it;
}
std:: cout << std:: endl ;
}
int main( )
{
std:: cout << "Custom Data Set --> " ;
int data[ ] = { 1 ,2 ,3 } ;
Custom_Iterator begin = data;
Custom_Iterator end = data+ 3 ;
f( begin, end) ;
std:: list < int > x = { 1 ,2 ,3 } ;
std:: cout << "List --> " ;
f( x.begin ( ) , x.end ( ) ) ;
std:: cout << "Vector<int> --> " ;
std:: vector < int > v = { 1 ,2 ,3 } ;
f( v.begin ( ) , v.end ( ) ) ;
std:: cout << "Vector<double> --> " ;
std:: vector < double > vd = { 1.1 ,2.2 ,3.3 } ;
f( vd.begin ( ) , vd.end ( ) ) ;
std:: cout << "String --> " ;
std:: string s = "WTF" ;
f( s.begin ( ) , s.end ( ) ) ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bGlzdD4KI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgojaW5jbHVkZSA8aXRlcmF0b3I+CgovLyBGaWd1cmUgb3V0IGlmIGNvbnRpZ3VvdXMgaGVyZSAtLT4gdGVtcGxhdGUgZnVuY3Rpb24gYm9vbCBpc19jb250aWd1b3VzPFR5cGU+KCk7CgovLyBVc2VyLWRlZmluZWQgaXRlcmF0b3IKdXNpbmcgQ3VzdG9tX0l0ZXJhdG9yID0gaW50KjsKCnRlbXBsYXRlPHR5cGVuYW1lIEl0ZXJhdG9yPgpjb25zdGV4cHIgYXV0byBpc19jb250aWd1b3VzKCkKCS0+IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfc2FtZTxJdGVyYXRvcixDdXN0b21fSXRlcmF0b3I+Ojp2YWx1ZSwgYm9vbD46OnR5cGUKewoJcmV0dXJuIHRydWU7IC8vIGNoYW5nZSB0byBmYWxzZSBpZiBub3QgYWN0dWFsbHkgY29udGlndW91cwp9CgoKLy8gU2ltcGxlIGNvbnRhaW5lcgp0ZW1wbGF0ZTx0eXBlbmFtZSBJdGVyYXRvcj4KY29uc3RleHByIGF1dG8gaXNfY29udGlndW91cygpCiAgICAtPiB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3NhbWU8SXRlcmF0b3Isc3RkOjpzdHJpbmc6Oml0ZXJhdG9yPjo6dmFsdWUsIGJvb2w+Ojp0eXBlCnsKCXJldHVybiB0cnVlOwp9CgoKLy8gU1RMIENvbnRhaW5lcnMgKHNlZW1zIHRvIHJlcXVpcmUgdHlwZW5hbWUgPSB2b2lkIHZvb2RvbykKdGVtcGxhdGU8dHlwZW5hbWUgSXRlcmF0b3IsIHR5cGVuYW1lIFUgPSB0eXBlbmFtZSBzdGQ6OnZlY3Rvcjx0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJdGVyYXRvcj46OnZhbHVlX3R5cGU+OjppdGVyYXRvcj4KY29uc3RleHByIGF1dG8gaXNfY29udGlndW91cygpCiAgICAtPiB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3NhbWU8SXRlcmF0b3IsVT46OnZhbHVlLCBib29sPjo6dHlwZQp7CglyZXR1cm4gdHJ1ZTsKfQoKdGVtcGxhdGU8dHlwZW5hbWUgSXRlcmF0b3IsIHR5cGVuYW1lIFUgPSB0eXBlbmFtZSBzdGQ6Omxpc3Q8dHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8SXRlcmF0b3I+Ojp2YWx1ZV90eXBlPjo6aXRlcmF0b3IsIHR5cGVuYW1lID0gdm9pZD4KY29uc3RleHByIGF1dG8gaXNfY29udGlndW91cygpCiAgICAtPiB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3NhbWU8SXRlcmF0b3IsVT46OnZhbHVlLCBib29sPjo6dHlwZQp7CglyZXR1cm4gZmFsc2U7Cn0KCgoKLy8gRG8gd29yayBoZXJlCnRlbXBsYXRlPHR5cGVuYW1lIEl0ZXJhdG9yPgphdXRvIGYoSXRlcmF0b3IgYmVnLCBJdGVyYXRvciBlbmQpCiAgICAtPiB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwgISBpc19jb250aWd1b3VzPEl0ZXJhdG9yPigpLCB2b2lkPjo6dHlwZQp7CglzdGQ6OmNvdXQgPDwgIk5vdCBjb250aWd1b3VzOiI7CiAgICBmb3IoYXV0byBpdCA9IGJlZzsgaXQgIT0gZW5kOyBpdCA9IHN0ZDo6bmV4dChpdCkpCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICIgIiA8PCAqaXQ7CiAgICB9CiAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwp9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBJdGVyYXRvcj4KYXV0byBmKEl0ZXJhdG9yIGJlZywgSXRlcmF0b3IgZW5kKQogICAgLT4gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8aXNfY29udGlndW91czxJdGVyYXRvcj4oKSwgdm9pZD46OnR5cGUKewogICAgc3RkOjpjb3V0IDw8ICJDb250aWd1b3VzOiI7CiAgICBmb3IoYXV0byBpdCA9IGJlZzsgaXQgIT0gZW5kOyBpdCA9IHN0ZDo6bmV4dChpdCkpCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICIgIiA8PCAqaXQ7CiAgICB9CiAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwp9CgoKaW50IG1haW4oKQp7CglzdGQ6OmNvdXQgPDwgIkN1c3RvbSBEYXRhIFNldCAtLT4gIjsKICAgIGludCBkYXRhW10gPSB7MSwyLDN9OwogICAgQ3VzdG9tX0l0ZXJhdG9yIGJlZ2luID0gZGF0YTsKICAgIEN1c3RvbV9JdGVyYXRvciBlbmQgPSBkYXRhKzM7CiAgICBmKGJlZ2luLCBlbmQpOwogICAgCiAgICBzdGQ6Omxpc3Q8aW50PiB4ID0gezEsMiwzfTsKICAgIHN0ZDo6Y291dCA8PCAiTGlzdCAtLT4gIjsKICAgIGYoeC5iZWdpbigpLCB4LmVuZCgpKTsKCiAgICBzdGQ6OmNvdXQgPDwgIlZlY3RvcjxpbnQ+IC0tPiAiOwogICAgc3RkOjp2ZWN0b3I8aW50PiB2ID0gezEsMiwzfTsKICAgIGYodi5iZWdpbigpLCB2LmVuZCgpKTsKICAgIAogICAgc3RkOjpjb3V0IDw8ICJWZWN0b3I8ZG91YmxlPiAtLT4gIjsKICAgIHN0ZDo6dmVjdG9yPGRvdWJsZT4gdmQgPSB7MS4xLDIuMiwzLjN9OwogICAgZih2ZC5iZWdpbigpLCB2ZC5lbmQoKSk7CiAgICAKICAgIHN0ZDo6Y291dCA8PCAiU3RyaW5nIC0tPiAiOwogICAgc3RkOjpzdHJpbmcgcyA9ICJXVEYiOwogICAgZihzLmJlZ2luKCksIHMuZW5kKCkpOwp9