| 851 | |
| 852 | template <typename Container> |
| 853 | static |
| 854 | typename std::enable_if<std::is_convertible<value_type,typename Container::value_type>::value && |
| 855 | ext_traits::has_reserve<Container>::value && |
| 856 | ext_traits::has_data_exact<value_type*,Container>::value |
| 857 | , std::size_t>::type |
| 858 | read(Source& source, Container& v, std::size_t length) |
| 859 | { |
| 860 | std::size_t unread = length; |
| 861 | |
| 862 | std::size_t n = (std::min)(max_buffer_length, unread); |
| 863 | while (n > 0 && !source.eof()) |
| 864 | { |
| 865 | std::size_t offset = v.size(); |
| 866 | v.resize(v.size()+n); |
| 867 | std::size_t actual = source.read(v.data()+offset, n); |
| 868 | unread -= actual; |
| 869 | n = (std::min)(max_buffer_length, unread); |
| 870 | } |
| 871 | |
| 872 | return length - unread; |
| 873 | } |
| 874 | |
| 875 | template <typename Container> |
| 876 | static |