fix sub_array for ICC 15

This commit is contained in:
bolero-MURAKAMI 2015-05-11 08:35:40 +09:00
parent 882d6a8a50
commit c2aa932646

View file

@ -27,16 +27,16 @@ namespace sprout {
template<typename Container> template<typename Container>
class sub_array_impl { class sub_array_impl {
protected: public:
typedef Container container_type; typedef Container container_type;
typedef typename std::remove_reference<container_type>::type internal_type; typedef typename std::remove_reference<container_type>::type internal_type;
protected: public:
SPROUT_STATIC_CONSTEXPR bool is_reference = std::is_reference<container_type>::value; SPROUT_STATIC_CONSTEXPR bool is_reference = std::is_reference<container_type>::value;
SPROUT_STATIC_CONSTEXPR bool is_const = std::is_const<internal_type>::value; SPROUT_STATIC_CONSTEXPR bool is_const = std::is_const<internal_type>::value;
protected: public:
typedef typename sprout::container_traits<internal_type>::const_iterator impl_const_iterator; typedef typename sprout::container_traits<internal_type>::const_iterator impl_const_iterator;
typedef typename sprout::container_traits<internal_type>::difference_type impl_difference_type; typedef typename sprout::container_traits<internal_type>::difference_type impl_difference_type;
protected: public:
typedef typename std::conditional< typedef typename std::conditional<
is_reference, is_reference,
internal_type*, internal_type*,
@ -48,13 +48,13 @@ namespace sprout {
internal_type const& internal_type const&
>::type param_type; >::type param_type;
typedef internal_type const& const_param_type; typedef internal_type const& const_param_type;
protected: public:
typedef typename std::conditional< typedef typename std::conditional<
std::is_array<holder_type>::value, std::is_array<holder_type>::value,
sprout::detail::is_non_reference_array_tag, sprout::detail::is_non_reference_array_tag,
sprout::detail::is_not_non_reference_array_tag sprout::detail::is_not_non_reference_array_tag
>::type array_tag; >::type array_tag;
protected: public:
template<typename Arr> template<typename Arr>
static SPROUT_CONSTEXPR typename std::enable_if< static SPROUT_CONSTEXPR typename std::enable_if<
std::is_reference<Arr>::value, std::is_reference<Arr>::value,
@ -139,7 +139,7 @@ namespace sprout {
>::type to_const_held(holder_type const& arr) { >::type to_const_held(holder_type const& arr) {
return arr; return arr;
} }
protected: public:
holder_type array_; holder_type array_;
impl_difference_type to_first_; impl_difference_type to_first_;
impl_difference_type to_last_; impl_difference_type to_last_;
@ -150,7 +150,7 @@ namespace sprout {
, to_last_() , to_last_()
{} {}
sub_array_impl(sub_array_impl const&) = default; sub_array_impl(sub_array_impl const&) = default;
protected: public:
template<typename ContainerTag, sprout::index_t... Indexes> template<typename ContainerTag, sprout::index_t... Indexes>
SPROUT_CONSTEXPR sub_array_impl( SPROUT_CONSTEXPR sub_array_impl(
ContainerTag, ContainerTag,
@ -211,8 +211,7 @@ namespace sprout {
// //
template<typename Container> template<typename Container>
class sub_array class sub_array
: private sprout::detail::sub_array_impl<Container> : public sprout::container_traits_facade<typename std::remove_reference<Container>::type>
, public sprout::container_traits_facade<typename std::remove_reference<Container>::type>
{ {
private: private:
typedef sprout::detail::sub_array_impl<Container> impl_type; typedef sprout::detail::sub_array_impl<Container> impl_type;
@ -241,15 +240,13 @@ namespace sprout {
private: private:
typedef typename impl_type::array_tag array_tag; typedef typename impl_type::array_tag array_tag;
private: private:
using impl_type::array_; impl_type impl_;
using impl_type::to_first_;
using impl_type::to_last_;
public: public:
// construct/copy/destroy: // construct/copy/destroy:
SPROUT_CONSTEXPR sub_array() SPROUT_DEFAULTED_DEFAULT_CONSTRUCTOR_DECL SPROUT_CONSTEXPR sub_array() SPROUT_DEFAULTED_DEFAULT_CONSTRUCTOR_DECL
sub_array(sub_array const&) = default; sub_array(sub_array const&) = default;
SPROUT_CONSTEXPR sub_array(param_type arr, const_iterator first, const_iterator last) SPROUT_CONSTEXPR sub_array(param_type arr, const_iterator first, const_iterator last)
: impl_type( : impl_(
array_tag(), array_tag(),
arr, arr,
sprout::make_index_tuple<enumerable_size>::make(), sprout::make_index_tuple<enumerable_size>::make(),
@ -258,7 +255,7 @@ namespace sprout {
) )
{} {}
SPROUT_CONSTEXPR sub_array(param_type arr, difference_type to_first, difference_type to_last) SPROUT_CONSTEXPR sub_array(param_type arr, difference_type to_first, difference_type to_last)
: impl_type( : impl_(
array_tag(), array_tag(),
arr, arr,
sprout::make_index_tuple<enumerable_size>::make(), sprout::make_index_tuple<enumerable_size>::make(),
@ -267,35 +264,35 @@ namespace sprout {
) )
{} {}
SPROUT_CONSTEXPR sub_array(sub_array const& other, const_iterator first, const_iterator last) SPROUT_CONSTEXPR sub_array(sub_array const& other, const_iterator first, const_iterator last)
: impl_type( : impl_(
array_tag(), array_tag(),
impl_type::template to_param<Container>(other.array_), impl_type::template to_param<Container>(other.impl_.array_),
sprout::make_index_tuple<enumerable_size>::make(), sprout::make_index_tuple<enumerable_size>::make(),
sprout::distance(sprout::begin(other.get_internal()), first), sprout::distance(sprout::begin(other.get_internal()), first),
sprout::distance(sprout::begin(other.get_internal()), last) sprout::distance(sprout::begin(other.get_internal()), last)
) )
{} {}
SPROUT_CONSTEXPR sub_array(sub_array const& other, difference_type to_first, difference_type to_last) SPROUT_CONSTEXPR sub_array(sub_array const& other, difference_type to_first, difference_type to_last)
: impl_type( : impl_(
array_tag(), array_tag(),
impl_type::template to_param<Container>(other.array_), impl_type::template to_param<Container>(other.impl_.array_),
sprout::make_index_tuple<enumerable_size>::make(), sprout::make_index_tuple<enumerable_size>::make(),
other.to_first_ + to_first, other.impl_.to_first_ + to_first,
other.to_first_ + to_last other.impl_.to_first_ + to_last
) )
{} {}
template<typename Container2> template<typename Container2>
SPROUT_CXX14_CONSTEXPR sub_array& operator=(sub_array<Container2> const& rhs) { SPROUT_CXX14_CONSTEXPR sub_array& operator=(sub_array<Container2> const& rhs) {
array_ = rhs.array_; impl_.array_ = rhs.impl_.array_;
to_first_ = rhs.to_first_; impl_.to_first_ = rhs.impl_.to_first_;
to_last_ = rhs.to_last_; impl_.to_last_ = rhs.impl_.to_last_;
return *this; return *this;
} }
template<typename Container2> template<typename Container2>
SPROUT_CXX14_CONSTEXPR sub_array& operator=(sub_array<Container2>&& rhs) { SPROUT_CXX14_CONSTEXPR sub_array& operator=(sub_array<Container2>&& rhs) {
array_ = sprout::move(rhs.array_); impl_.array_ = sprout::move(rhs.impl_.array_);
to_first_ = sprout::move(rhs.to_first_); impl_.to_first_ = sprout::move(rhs.impl_.to_first_);
to_last_ = sprout::move(rhs.to_last_); impl_.to_last_ = sprout::move(rhs.impl_.to_last_);
return *this; return *this;
} }
@ -304,76 +301,76 @@ namespace sprout {
} }
template<typename Container2> template<typename Container2>
SPROUT_CXX14_CONSTEXPR void swap(sub_array<Container2>& other) SPROUT_CXX14_CONSTEXPR void swap(sub_array<Container2>& other)
SPROUT_NOEXCEPT_IF_EXPR(sprout::swap(other.array_, array_)) SPROUT_NOEXCEPT_IF_EXPR(sprout::swap(other.impl_.array_, impl_.array_))
{ {
sprout::swap(other.array_, array_); sprout::swap(other.impl_.array_, impl_.array_);
sprout::swap(other.to_first_, to_first_); sprout::swap(other.impl_.to_first_, impl_.to_first_);
sprout::swap(other.to_last_, to_last_); sprout::swap(other.impl_.to_last_, impl_.to_last_);
} }
// iterators: // iterators:
SPROUT_CXX14_CONSTEXPR iterator begin() { SPROUT_CXX14_CONSTEXPR iterator begin() {
return sprout::next(sprout::begin(get_internal()), to_first_); return sprout::next(sprout::begin(get_internal()), impl_.to_first_);
} }
SPROUT_CONSTEXPR const_iterator begin() const { SPROUT_CONSTEXPR const_iterator begin() const {
return sprout::next(sprout::begin(get_internal()), to_first_); return sprout::next(sprout::begin(get_internal()), impl_.to_first_);
} }
SPROUT_CXX14_CONSTEXPR iterator end() { SPROUT_CXX14_CONSTEXPR iterator end() {
return sprout::next(sprout::begin(get_internal()), to_last_); return sprout::next(sprout::begin(get_internal()), impl_.to_last_);
} }
SPROUT_CONSTEXPR const_iterator end() const { SPROUT_CONSTEXPR const_iterator end() const {
return sprout::next(sprout::begin(get_internal()), to_last_); return sprout::next(sprout::begin(get_internal()), impl_.to_last_);
} }
SPROUT_CONSTEXPR const_iterator cbegin() const { SPROUT_CONSTEXPR const_iterator cbegin() const {
return sprout::next(sprout::begin(get_internal()), to_first_); return sprout::next(sprout::begin(get_internal()), impl_.to_first_);
} }
SPROUT_CONSTEXPR const_iterator cend() const { SPROUT_CONSTEXPR const_iterator cend() const {
return sprout::next(sprout::begin(get_internal()), to_last_); return sprout::next(sprout::begin(get_internal()), impl_.to_last_);
} }
// capacity: // capacity:
SPROUT_CONSTEXPR size_type size() const { SPROUT_CONSTEXPR size_type size() const {
return to_last_ - to_first_; return impl_.to_last_ - impl_.to_first_;
} }
SPROUT_CONSTEXPR size_type max_size() const { SPROUT_CONSTEXPR size_type max_size() const {
return size(); return size();
} }
SPROUT_CONSTEXPR bool empty() const { SPROUT_CONSTEXPR bool empty() const {
return to_first_ == to_last_; return impl_.to_first_ == impl_.to_last_;
} }
// element access: // element access:
SPROUT_CXX14_CONSTEXPR reference operator[](size_type i) { SPROUT_CXX14_CONSTEXPR reference operator[](size_type i) {
return *sprout::next(sprout::begin(get_internal()), to_first_ + i); return *sprout::next(sprout::begin(get_internal()), impl_.to_first_ + i);
} }
SPROUT_CONSTEXPR const_reference operator[](size_type i) const { SPROUT_CONSTEXPR const_reference operator[](size_type i) const {
return *sprout::next(sprout::begin(get_internal()), to_first_ + i); return *sprout::next(sprout::begin(get_internal()), impl_.to_first_ + i);
} }
SPROUT_CXX14_CONSTEXPR reference at(size_type i) { SPROUT_CXX14_CONSTEXPR reference at(size_type i) {
return i < size() ? *sprout::next(sprout::begin(get_internal()), to_first_ + i) return i < size() ? *sprout::next(sprout::begin(get_internal()), impl_.to_first_ + i)
: (throw std::out_of_range("sub_array<>: index out of range"), *sprout::next(sprout::begin(get_internal()), to_first_ + i)) : (throw std::out_of_range("sub_array<>: index out of range"), *sprout::next(sprout::begin(get_internal()), impl_.to_first_ + i))
; ;
} }
SPROUT_CONSTEXPR const_reference at(size_type i) const { SPROUT_CONSTEXPR const_reference at(size_type i) const {
return i < size() ? *sprout::next(sprout::begin(get_internal()), to_first_ + i) return i < size() ? *sprout::next(sprout::begin(get_internal()), impl_.to_first_ + i)
: (throw std::out_of_range("sub_array<>: index out of range"), *sprout::next(sprout::begin(get_internal()), to_first_ + i)) : (throw std::out_of_range("sub_array<>: index out of range"), *sprout::next(sprout::begin(get_internal()), impl_.to_first_ + i))
; ;
} }
SPROUT_CXX14_CONSTEXPR reference front() { SPROUT_CXX14_CONSTEXPR reference front() {
return *sprout::next(sprout::begin(get_internal()), to_first_); return *sprout::next(sprout::begin(get_internal()), impl_.to_first_);
} }
SPROUT_CONSTEXPR const_reference front() const { SPROUT_CONSTEXPR const_reference front() const {
return *sprout::next(sprout::begin(get_internal()), to_first_); return *sprout::next(sprout::begin(get_internal()), impl_.to_first_);
} }
SPROUT_CXX14_CONSTEXPR reference back() { SPROUT_CXX14_CONSTEXPR reference back() {
return *sprout::next(sprout::begin(get_internal()), to_last_ - 1); return *sprout::next(sprout::begin(get_internal()), impl_.to_last_ - 1);
} }
SPROUT_CONSTEXPR const_reference back() const { SPROUT_CONSTEXPR const_reference back() const {
return *sprout::next(sprout::begin(get_internal()), to_last_ - 1); return *sprout::next(sprout::begin(get_internal()), impl_.to_last_ - 1);
} }
SPROUT_CXX14_CONSTEXPR pointer data() { SPROUT_CXX14_CONSTEXPR pointer data() {
return get_internal().data() + to_first_; return get_internal().data() + impl_.to_first_;
} }
SPROUT_CONSTEXPR const_pointer data() const { SPROUT_CONSTEXPR const_pointer data() const {
return get_internal().data() + to_first_; return get_internal().data() + impl_.to_first_;
} }
// others: // others:
SPROUT_CXX14_CONSTEXPR pointer c_array() { SPROUT_CXX14_CONSTEXPR pointer c_array() {
@ -392,28 +389,28 @@ namespace sprout {
} }
SPROUT_CXX14_CONSTEXPR internal_type& get_internal() { SPROUT_CXX14_CONSTEXPR internal_type& get_internal() {
return impl_type::template to_held<Container>(array_); return impl_type::template to_held<Container>(impl_.array_);
} }
SPROUT_CONSTEXPR internal_type const& get_internal() const { SPROUT_CONSTEXPR internal_type const& get_internal() const {
return impl_type::template to_const_held<Container>(array_); return impl_type::template to_const_held<Container>(impl_.array_);
} }
SPROUT_CXX14_CONSTEXPR internal_type& get_array() { SPROUT_CXX14_CONSTEXPR internal_type& get_array() {
return impl_type::template to_held<Container>(array_); return impl_type::template to_held<Container>(impl_.array_);
} }
SPROUT_CONSTEXPR internal_type const& get_array() const { SPROUT_CONSTEXPR internal_type const& get_array() const {
return impl_type::template to_const_held<Container>(array_); return impl_type::template to_const_held<Container>(impl_.array_);
} }
SPROUT_CONSTEXPR difference_type to_first() const { SPROUT_CONSTEXPR difference_type to_first() const {
return to_first_; return impl_.to_first_;
} }
SPROUT_CONSTEXPR difference_type to_last() const { SPROUT_CONSTEXPR difference_type to_last() const {
return to_last_; return impl_.to_last_;
} }
SPROUT_CONSTEXPR difference_type from_begin() const { SPROUT_CONSTEXPR difference_type from_begin() const {
return to_first_; return impl_.to_first_;
} }
SPROUT_CONSTEXPR difference_type from_end() const { SPROUT_CONSTEXPR difference_type from_end() const {
return to_last_ - sprout::size(get_internal()); return impl_.to_last_ - sprout::size(get_internal());
} }
SPROUT_CXX14_CONSTEXPR iterator nth(size_type i) { SPROUT_CXX14_CONSTEXPR iterator nth(size_type i) {