| 250 | |
| 251 | template< typename InputIterator > |
| 252 | typename traits::enable_if< helpers::decays_to_ctype< typename std::iterator_traits< InputIterator >::value_type >::value, |
| 253 | typename helpers::ctype< typename std::iterator_traits< InputIterator >::value_type >::type >::type |
| 254 | prod(InputIterator begin, InputIterator end) { |
| 255 | |
| 256 | typedef typename helpers::ctype< typename std::iterator_traits< InputIterator >::value_type >::type value_type; |
| 257 | typedef typename helpers::rtype< value_type > rtype; |
| 258 | |
| 259 | if (begin != end) { |
| 260 | value_type start = rtype::ONE(); |
| 261 | |
| 262 | while (begin != end) { |
| 263 | if (!Vector< rtype::RTYPE >::is_na(*begin)) { |
| 264 | start *= *begin++; |
| 265 | } else { |
| 266 | return rtype::NA(); |
| 267 | } |
| 268 | } |
| 269 | |
| 270 | return start; |
| 271 | } |
| 272 | |
| 273 | return rtype::ONE(); |
| 274 | } |
| 275 | |
| 276 | template< typename InputIterator > |
| 277 | typename traits::enable_if< helpers::decays_to_ctype< typename std::iterator_traits< InputIterator >::value_type >::value, |