| 275 | |
| 276 | template< typename InputIterator > |
| 277 | typename traits::enable_if< helpers::decays_to_ctype< typename std::iterator_traits< InputIterator >::value_type >::value, |
| 278 | typename helpers::ctype< typename std::iterator_traits< InputIterator >::value_type >::type >::type |
| 279 | prod_nona(InputIterator begin, InputIterator end) { |
| 280 | |
| 281 | typedef typename helpers::ctype< typename std::iterator_traits< InputIterator >::value_type >::type value_type; |
| 282 | typedef typename helpers::rtype< value_type > rtype; |
| 283 | |
| 284 | if (begin != end) { |
| 285 | value_type start = rtype::ONE(); |
| 286 | |
| 287 | while (begin != end) { |
| 288 | start *= *begin++; |
| 289 | } |
| 290 | |
| 291 | return start; |
| 292 | } |
| 293 | |
| 294 | return rtype::ONE(); |
| 295 | } |
| 296 | |
| 297 | template< typename InputIterator > |
| 298 | typename traits::enable_if< helpers::decays_to_ctype< typename std::iterator_traits< InputIterator >::value_type >::value, |