diff --git a/alib2std/src/extensions/vector.hpp b/alib2std/src/extensions/vector.hpp index ac38f9ceea79286b874a0613150394d645af8630..52c4af268ca1bb791e7fa8a41ba7c2fa2241a904 100644 --- a/alib2std/src/extensions/vector.hpp +++ b/alib2std/src/extensions/vector.hpp @@ -241,6 +241,25 @@ vector < bool, Ts ... > operator >> ( vector < bool, Ts ... > A, size_t dist ) { return A; } +template < class ... Ts > +bool any ( const vector < bool, Ts ... > & v ) { + size_t sizeWithin = v.size ( ) % vectorBoolInternalTypeInBits; + + typename vector < bool, Ts ... >::const_iterator itV = v.begin ( ); + + // c++ implementation-specific + while ( itV + 1 < v.end ( ) ) + if ( * ( itV._M_p ++ ) != 0 ) + return true; + + if ( sizeWithin == 0 ) + return * itV._M_p != 0; + else { + vectorBoolInternalType maskTopWord = getMask ( sizeWithin ); + return ( * itV._M_p & maskTopWord ) != 0; + } +} + } /* namespace std */ #endif /* __VECTOR_HPP_ */