support for C++14 constexpr: some classes

This commit is contained in:
bolero-MURAKAMI 2013-10-30 18:15:57 +09:00
parent 478c476611
commit ff36d79afc
6 changed files with 93 additions and 83 deletions

View file

@ -47,31 +47,31 @@ namespace sprout {
value_type elem;
public:
pit() = default;
void swap(pit& other)
SPROUT_CXX14_CONSTEXPR void swap(pit& other)
SPROUT_NOEXCEPT_EXPR(SPROUT_NOEXCEPT_EXPR(sprout::swap(elem, other.elem)))
{
sprout::swap(elem, other.elem);
}
// iterators:
iterator begin() {
SPROUT_CXX14_CONSTEXPR iterator begin() {
return iterator(elem, enumerable_size);
}
SPROUT_CONSTEXPR const_iterator begin() const {
return const_iterator(elem, enumerable_size);
}
iterator end() SPROUT_NOEXCEPT {
SPROUT_CXX14_CONSTEXPR iterator end() SPROUT_NOEXCEPT {
return iterator(elem, 0);
}
SPROUT_CONSTEXPR const_iterator end() const SPROUT_NOEXCEPT {
return const_iterator(elem, 0);
}
reverse_iterator rbegin() SPROUT_NOEXCEPT {
SPROUT_CXX14_CONSTEXPR reverse_iterator rbegin() SPROUT_NOEXCEPT {
return reverse_iterator(end());
}
SPROUT_CONSTEXPR const_reverse_iterator rbegin() const SPROUT_NOEXCEPT {
return const_reverse_iterator(end());
}
reverse_iterator rend() SPROUT_NOEXCEPT {
SPROUT_CXX14_CONSTEXPR reverse_iterator rend() SPROUT_NOEXCEPT {
return reverse_iterator(begin());
}
SPROUT_CONSTEXPR const_reverse_iterator rend() const SPROUT_NOEXCEPT {
@ -100,13 +100,13 @@ namespace sprout {
return enumerable_size == 0;
}
// element access:
reference operator[](size_type) {
SPROUT_CXX14_CONSTEXPR reference operator[](size_type) {
return elem;
}
SPROUT_CONSTEXPR const_reference operator[](size_type) const {
return elem;
}
reference at(size_type i) {
SPROUT_CXX14_CONSTEXPR reference at(size_type i) {
return i < size()
? elem
: (throw std::out_of_range("pit<>: index out of range"), elem)
@ -118,20 +118,20 @@ namespace sprout {
: (throw std::out_of_range("pit<>: index out of range"), elem)
;
}
reference front() {
SPROUT_CXX14_CONSTEXPR reference front() {
return elem;
}
SPROUT_CONSTEXPR const_reference front() const {
return elem;
}
reference back() {
SPROUT_CXX14_CONSTEXPR reference back() {
return elem;
}
SPROUT_CONSTEXPR const_reference back() const {
return elem;
}
// others:
void rangecheck(size_type i) const {
SPROUT_CXX14_CONSTEXPR void rangecheck(size_type i) const {
if (i >= size()) {
throw std::out_of_range("pit<>: index out of range");
}
@ -144,7 +144,7 @@ namespace sprout {
// swap
//
template<typename Container>
inline void
inline SPROUT_CXX14_CONSTEXPR void
swap(sprout::pit<Container>& lhs, sprout::pit<Container>& rhs)
SPROUT_NOEXCEPT_EXPR(SPROUT_NOEXCEPT_EXPR(lhs.swap(rhs)))
{

View file

@ -84,31 +84,31 @@ namespace sprout {
SPROUT_CONSTEXPR random_result operator()() const {
return distribution_(engine_);
}
result_type& result() SPROUT_NOEXCEPT {
SPROUT_CXX14_CONSTEXPR result_type& result() SPROUT_NOEXCEPT {
return result_;
}
SPROUT_CONSTEXPR result_type const& result() const SPROUT_NOEXCEPT {
return result_;
}
result_type& generated_value() SPROUT_NOEXCEPT {
SPROUT_CXX14_CONSTEXPR result_type& generated_value() SPROUT_NOEXCEPT {
return result_;
}
SPROUT_CONSTEXPR result_type const& generated_value() const SPROUT_NOEXCEPT {
return result_;
}
engine_type& engine() SPROUT_NOEXCEPT {
SPROUT_CXX14_CONSTEXPR engine_type& engine() SPROUT_NOEXCEPT {
return engine_;
}
SPROUT_CONSTEXPR engine_type const& engine() const SPROUT_NOEXCEPT {
return engine_;
}
random_result& next_generator() SPROUT_NOEXCEPT {
SPROUT_CXX14_CONSTEXPR random_result& next_generator() SPROUT_NOEXCEPT {
return *this;
}
SPROUT_CONSTEXPR random_result const& next_generator() const SPROUT_NOEXCEPT {
return *this;
}
distribution_type& distribution() SPROUT_NOEXCEPT {
SPROUT_CXX14_CONSTEXPR distribution_type& distribution() SPROUT_NOEXCEPT {
return distribution_;
}
SPROUT_CONSTEXPR distribution_type const& distribution() const SPROUT_NOEXCEPT {
@ -126,7 +126,7 @@ namespace sprout {
SPROUT_CONSTEXPR result_type max() const SPROUT_NOEXCEPT {
return distribution_.max();
}
void swap(random_result& other)
SPROUT_CXX14_CONSTEXPR void swap(random_result& other)
SPROUT_NOEXCEPT_EXPR(
SPROUT_NOEXCEPT_EXPR(sprout::swap(result_, other.result_))
&& SPROUT_NOEXCEPT_EXPR(sprout::swap(engine_, other.engine_))
@ -152,12 +152,12 @@ namespace sprout {
SPROUT_CONSTEXPR pointer operator->() const SPROUT_NOEXCEPT {
return &result_;
}
random_result& operator++() {
SPROUT_CXX14_CONSTEXPR random_result& operator++() {
random_result temp((*this)());
temp.swap(*this);
return *this;
}
random_result operator++(int) {
SPROUT_CXX14_CONSTEXPR random_result operator++(int) {
random_result result(*this);
++*this;
return result;
@ -215,25 +215,25 @@ namespace sprout {
SPROUT_CONSTEXPR random_result operator()() const {
return engine_();
}
result_type& result() SPROUT_NOEXCEPT {
SPROUT_CXX14_CONSTEXPR result_type& result() SPROUT_NOEXCEPT {
return result_;
}
SPROUT_CONSTEXPR result_type const& result() const SPROUT_NOEXCEPT {
return result_;
}
result_type& generated_value() SPROUT_NOEXCEPT {
SPROUT_CXX14_CONSTEXPR result_type& generated_value() SPROUT_NOEXCEPT {
return result_;
}
SPROUT_CONSTEXPR result_type const& generated_value() const SPROUT_NOEXCEPT {
return result_;
}
engine_type& engine() SPROUT_NOEXCEPT {
SPROUT_CXX14_CONSTEXPR engine_type& engine() SPROUT_NOEXCEPT {
return engine_;
}
SPROUT_CONSTEXPR engine_type const& engine() const SPROUT_NOEXCEPT {
return engine_;
}
random_result& next_generator() SPROUT_NOEXCEPT {
SPROUT_CXX14_CONSTEXPR random_result& next_generator() SPROUT_NOEXCEPT {
return *this;
}
SPROUT_CONSTEXPR random_result const& next_generator() const SPROUT_NOEXCEPT {
@ -274,12 +274,12 @@ namespace sprout {
SPROUT_CONSTEXPR pointer operator->() const SPROUT_NOEXCEPT {
return &result_;
}
random_result& operator++() {
SPROUT_CXX14_CONSTEXPR random_result& operator++() {
random_result temp((*this)());
temp.swap(*this);
return *this;
}
random_result operator++(int) {
SPROUT_CXX14_CONSTEXPR random_result operator++(int) {
random_result result(*this);
random_result temp((*this)());
temp.swap(*this);
@ -291,7 +291,7 @@ namespace sprout {
// swap
//
template<typename Engine, typename Distribution>
inline void
inline SPROUT_CXX14_CONSTEXPR void
swap(sprout::random::random_result<Engine, Distribution>& lhs, sprout::random::random_result<Engine, Distribution>& rhs)
SPROUT_NOEXCEPT_EXPR(SPROUT_NOEXCEPT_EXPR(lhs.swap(rhs)))
{

View file

@ -96,11 +96,15 @@ namespace sprout {
: base_type(n, d, normalize_g(n, d))
{}
rational& operator=(rational const&) = default;
rational& operator=(param_type n) SPROUT_NOEXCEPT {
SPROUT_CXX14_CONSTEXPR rational& operator=(rational const& rhs) SPROUT_NOEXCEPT {
rational temp(rhs);
sprout::swap(temp, *this);
return *this;
}
SPROUT_CXX14_CONSTEXPR rational& operator=(param_type n) SPROUT_NOEXCEPT {
return assign(n, 1);
}
rational& assign(param_type n, param_type d) {
SPROUT_CXX14_CONSTEXPR rational& assign(param_type n, param_type d) {
rational temp(n, d);
sprout::swap(temp, *this);
return *this;
@ -113,7 +117,7 @@ namespace sprout {
return den_;
}
rational& operator+=(rational const& rhs) {
SPROUT_CXX14_CONSTEXPR rational& operator+=(rational const& rhs) {
IntType g = sprout::gcd(den_, rhs.den_);
den_ /= g;
num_ = num_ * (rhs.den_ / g) + rhs.num_ * den_;
@ -122,7 +126,7 @@ namespace sprout {
den_ *= rhs.den_ / g;
return *this;
}
rational& operator-=(rational const& rhs) {
SPROUT_CXX14_CONSTEXPR rational& operator-=(rational const& rhs) {
IntType g = sprout::gcd(den_, rhs.den_);
den_ /= g;
num_ = num_ * (rhs.den_ / g) - rhs.num_ * den_;
@ -131,14 +135,14 @@ namespace sprout {
den_ *= rhs.den_ / g;
return *this;
}
rational& operator*=(rational const& rhs) {
SPROUT_CXX14_CONSTEXPR rational& operator*=(rational const& rhs) {
IntType gcd1 = sprout::gcd(num_, rhs.den_);
IntType gcd2 = sprout::gcd(rhs.num_, den_);
num_ =(num_ / gcd1) * (rhs.num_ / gcd2);
den_ =(den_ / gcd2) * (rhs.den_ / gcd1);
return *this;
}
rational& operator/=(rational const& rhs) {
SPROUT_CXX14_CONSTEXPR rational& operator/=(rational const& rhs) {
if (rhs.num_ == IntType(0)) {
throw sprout::bad_rational();
}
@ -155,33 +159,33 @@ namespace sprout {
}
return *this;
}
rational& operator+=(param_type rhs) {
SPROUT_CXX14_CONSTEXPR rational& operator+=(param_type rhs) {
return *this += rational(rhs);
}
rational& operator-=(param_type rhs) {
SPROUT_CXX14_CONSTEXPR rational& operator-=(param_type rhs) {
return *this -= rational(rhs);
}
rational& operator*=(param_type rhs) {
SPROUT_CXX14_CONSTEXPR rational& operator*=(param_type rhs) {
return *this *= rational(rhs);
}
rational& operator/=(param_type rhs) {
SPROUT_CXX14_CONSTEXPR rational& operator/=(param_type rhs) {
return *this /= rational(rhs);
}
rational& operator++() SPROUT_NOEXCEPT {
SPROUT_CXX14_CONSTEXPR rational& operator++() SPROUT_NOEXCEPT {
num_ += den_;
return *this;
}
rational& operator--() SPROUT_NOEXCEPT {
SPROUT_CXX14_CONSTEXPR rational& operator--() SPROUT_NOEXCEPT {
num_ -= den_;
return *this;
}
rational operator++(int) SPROUT_NOEXCEPT {
SPROUT_CXX14_CONSTEXPR rational operator++(int) SPROUT_NOEXCEPT {
rational result(*this);
++*this;
return result;
}
rational operator--(int) SPROUT_NOEXCEPT {
SPROUT_CXX14_CONSTEXPR rational operator--(int) SPROUT_NOEXCEPT {
rational result(*this);
--*this;
return result;

View file

@ -243,11 +243,11 @@ namespace sprout {
)
{}
void fill(const_reference value) {
SPROUT_CXX14_CONSTEXPR void fill(const_reference value) {
std::fill_n(begin(), size(), value);
}
template<typename Container2>
void swap(sub_array<Container2>& other)
SPROUT_CXX14_CONSTEXPR void swap(sub_array<Container2>& other)
SPROUT_NOEXCEPT_EXPR(SPROUT_NOEXCEPT_EXPR(sprout::swap(other.array_, array_)))
{
sprout::swap(other.array_, array_);
@ -255,13 +255,13 @@ namespace sprout {
sprout::swap(other.to_last_, to_last_);
}
// iterators:
iterator begin() {
SPROUT_CXX14_CONSTEXPR iterator begin() {
return sprout::next(sprout::begin(get_array()), to_first_);
}
SPROUT_CONSTEXPR const_iterator begin() const {
return sprout::next(sprout::begin(get_array()), to_first_);
}
iterator end() {
SPROUT_CXX14_CONSTEXPR iterator end() {
return sprout::next(sprout::begin(get_array()), to_last_);
}
SPROUT_CONSTEXPR const_iterator end() const {
@ -284,13 +284,13 @@ namespace sprout {
return to_first_ == to_last_;
}
// element access:
reference operator[](size_type i) {
SPROUT_CXX14_CONSTEXPR reference operator[](size_type i) {
return *sprout::next(sprout::begin(get_array()), to_first_ + i);
}
SPROUT_CONSTEXPR const_reference operator[](size_type i) const {
return *sprout::next(sprout::begin(get_array()), to_first_ + i);
}
reference at(size_type i) {
SPROUT_CXX14_CONSTEXPR reference at(size_type i) {
return i < size() ? *sprout::next(sprout::begin(get_array()), to_first_ + i)
: (throw std::out_of_range("sub_array<>: index out of range"), *sprout::next(sprout::begin(get_array()), to_first_ + i))
;
@ -300,20 +300,20 @@ namespace sprout {
: (throw std::out_of_range("sub_array<>: index out of range"), *sprout::next(sprout::begin(get_array()), to_first_ + i))
;
}
reference front() {
SPROUT_CXX14_CONSTEXPR reference front() {
return *sprout::next(sprout::begin(get_array()), to_first_);
}
SPROUT_CONSTEXPR const_reference front() const {
return *sprout::next(sprout::begin(get_array()), to_first_);
}
reference back() {
SPROUT_CXX14_CONSTEXPR reference back() {
return *sprout::next(sprout::begin(get_array()), to_last_ - 1);
}
SPROUT_CONSTEXPR const_reference back() const {
return *sprout::next(sprout::begin(get_array()), to_last_ - 1);
}
pointer data() {
SPROUT_CXX14_CONSTEXPR pointer data() {
return get_array().data() + to_first_;
}
SPROUT_CONSTEXPR const_pointer data() const {
@ -321,32 +321,35 @@ namespace sprout {
}
// others:
template<typename Container2>
sub_array& operator=(sub_array<Container2> const& rhs) {
SPROUT_CXX14_CONSTEXPR sub_array& operator=(sub_array<Container2> const& rhs) {
array_ = rhs.array_;
to_first_ = rhs.to_first_;
to_last_ = rhs.to_last_;
return *this;
}
template<typename Container2>
sub_array& operator=(sub_array<Container2>&& rhs) {
SPROUT_CXX14_CONSTEXPR sub_array& operator=(sub_array<Container2>&& rhs) {
array_ = std::move(rhs.array_);
to_first_ = std::move(rhs.to_first_);
to_last_ = std::move(rhs.to_last_);
return *this;
}
pointer c_array() {
SPROUT_CXX14_CONSTEXPR pointer c_array() {
return data();
}
void assign(const_reference value) {
SPROUT_CONSTEXPR const_pointer c_array() const {
return data();
}
SPROUT_CXX14_CONSTEXPR void assign(const_reference value) {
fill(value);
}
void rangecheck(size_type i) const {
SPROUT_CXX14_CONSTEXPR void rangecheck(size_type i) const {
if (i >= size()) {
throw std::out_of_range("sub_array<>: index out of range");
}
}
param_type get_internal() {
SPROUT_CXX14_CONSTEXPR param_type get_internal() {
return impl_type::template to_param<Container>(array_);
}
SPROUT_CONSTEXPR const_param_type get_internal() const {
@ -378,7 +381,7 @@ namespace sprout {
// swap
//
template<typename Container>
inline void
inline SPROUT_CXX14_CONSTEXPR void
swap(sprout::sub_array<Container>& lhs, sprout::sub_array<Container>& rhs)
SPROUT_NOEXCEPT_EXPR(SPROUT_NOEXCEPT_EXPR(lhs.swap(rhs)))
{

View file

@ -81,47 +81,47 @@ namespace sprout {
public:
value_type elems[static_size];
public:
void fill(const_reference value) {
SPROUT_CXX14_CONSTEXPR void fill(const_reference value) {
std::fill_n(begin(), size(), value);
}
void swap(uuid& other) SPROUT_NOEXCEPT {
SPROUT_CXX14_CONSTEXPR void swap(uuid& other) SPROUT_NOEXCEPT {
std::swap_ranges(other.begin(), other.end(), begin());
}
// iterators:
#if SPROUT_USE_INDEX_ITERATOR_IMPLEMENTATION
iterator begin() SPROUT_NOEXCEPT {
SPROUT_CXX14_CONSTEXPR iterator begin() SPROUT_NOEXCEPT {
return iterator(*this, 0);
}
SPROUT_CONSTEXPR const_iterator begin() const SPROUT_NOEXCEPT {
return const_iterator(*this, 0);
}
iterator end() SPROUT_NOEXCEPT {
SPROUT_CXX14_CONSTEXPR iterator end() SPROUT_NOEXCEPT {
return iterator(*this, size());
}
SPROUT_CONSTEXPR const_iterator end() const SPROUT_NOEXCEPT {
return const_iterator(*this, size());
}
#else
iterator begin() SPROUT_NOEXCEPT {
SPROUT_CXX14_CONSTEXPR iterator begin() SPROUT_NOEXCEPT {
return &elems[0];
}
SPROUT_CONSTEXPR const_iterator begin() const SPROUT_NOEXCEPT {
return &elems[0];
}
iterator end() SPROUT_NOEXCEPT {
SPROUT_CXX14_CONSTEXPR iterator end() SPROUT_NOEXCEPT {
return &elems[0] + size();
}
SPROUT_CONSTEXPR const_iterator end() const SPROUT_NOEXCEPT {
return &elems[0] + size();
}
#endif
reverse_iterator rbegin() SPROUT_NOEXCEPT {
SPROUT_CXX14_CONSTEXPR reverse_iterator rbegin() SPROUT_NOEXCEPT {
return reverse_iterator(end());
}
SPROUT_CONSTEXPR const_reverse_iterator rbegin() const SPROUT_NOEXCEPT {
return const_reverse_iterator(end());
}
reverse_iterator rend() SPROUT_NOEXCEPT {
SPROUT_CXX14_CONSTEXPR reverse_iterator rend() SPROUT_NOEXCEPT {
return reverse_iterator(begin());
}
SPROUT_CONSTEXPR const_reverse_iterator rend() const SPROUT_NOEXCEPT {
@ -159,13 +159,13 @@ namespace sprout {
return size() == 0;
}
// element access:
reference operator[](size_type i) {
SPROUT_CXX14_CONSTEXPR reference operator[](size_type i) {
return elems[i];
}
SPROUT_CONSTEXPR const_reference operator[](size_type i) const {
return elems[i];
}
reference at(size_type i) {
SPROUT_CXX14_CONSTEXPR reference at(size_type i) {
return i < size()
? elems[i]
: (throw std::out_of_range("uuid: index out of range"), elems[i])
@ -177,20 +177,20 @@ namespace sprout {
: (throw std::out_of_range("uuid: index out of range"), elems[i])
;
}
reference front() {
SPROUT_CXX14_CONSTEXPR reference front() {
return elems[0];
}
SPROUT_CONSTEXPR const_reference front() const {
return elems[0];
}
reference back() {
SPROUT_CXX14_CONSTEXPR reference back() {
return elems[size() - 1];
}
SPROUT_CONSTEXPR const_reference back() const {
return elems[size() - 1];
}
pointer data() SPROUT_NOEXCEPT {
SPROUT_CXX14_CONSTEXPR pointer data() SPROUT_NOEXCEPT {
return &elems[0];
}
SPROUT_CONSTEXPR const_pointer data() const SPROUT_NOEXCEPT {
@ -198,13 +198,16 @@ namespace sprout {
}
// others:
pointer c_array() SPROUT_NOEXCEPT {
SPROUT_CXX14_CONSTEXPR pointer c_array() SPROUT_NOEXCEPT {
return &elems[0];
}
void assign(const_reference value) {
SPROUT_CONSTEXPR const_pointer c_array() SPROUT_NOEXCEPT {
return &elems[0];
}
SPROUT_CXX14_CONSTEXPR void assign(const_reference value) {
fill(value);
}
void rangecheck(size_type i) const {
SPROUT_CXX14_CONSTEXPR void rangecheck(size_type i) const {
if (i >= size()) {
throw std::out_of_range("uuid: index out of range");
}
@ -267,7 +270,7 @@ namespace sprout {
//
// swap
//
inline void
inline SPROUT_CXX14_CONSTEXPR void
swap(sprout::uuids::uuid& lhs, sprout::uuids::uuid& rhs)
SPROUT_NOEXCEPT_EXPR(SPROUT_NOEXCEPT_EXPR(lhs.swap(rhs)))
{

View file

@ -63,7 +63,7 @@ namespace sprout {
static_assert(Index::value < sizeof...(Types), "variant<>: invalid operand");
}
public:
void swap(variant_impl& other)
SPROUT_CXX14_CONSTEXPR void swap(variant_impl& other)
SPROUT_NOEXCEPT_EXPR(SPROUT_NOEXCEPT_EXPR(sprout::swap(tuple_, other.tuple_)))
{
sprout::swap(tuple_, other.tuple_);
@ -238,23 +238,23 @@ namespace sprout {
)
{}
// modifiers
void swap(variant& other)
SPROUT_CXX14_CONSTEXPR void swap(variant& other)
SPROUT_NOEXCEPT_EXPR(SPROUT_NOEXCEPT_EXPR(std::declval<impl_type&>().swap(other)))
{
impl_type::swap(other);
}
variant& operator=(variant const& rhs) {
SPROUT_CXX14_CONSTEXPR variant& operator=(variant const& rhs) {
static_cast<impl_type&>(*this) = rhs;
return *this;
}
variant& operator=(variant&& rhs)
SPROUT_CXX14_CONSTEXPR variant& operator=(variant&& rhs)
SPROUT_NOEXCEPT_EXPR(std::is_nothrow_move_assignable<impl_type>::value)
{
static_cast<impl_type&>(*this) = sprout::move(rhs);
return *this;
}
template<typename T>
variant& operator=(T&& rhs) {
SPROUT_CXX14_CONSTEXPR variant& operator=(T&& rhs) {
static_cast<impl_type&>(*this) = variant(sprout::forward<T>(rhs));
return *this;
}
@ -302,7 +302,7 @@ namespace sprout {
;
}
template<std::size_t I>
typename std::enable_if<
SPROUT_CXX14_CONSTEXPR typename std::enable_if<
I != sizeof...(Types),
typename sprout::tuples::tuple_element<I, tuple_type>::type&
>::type get_at() {
@ -318,7 +318,7 @@ namespace sprout {
return get_at<sprout::types::find_index<tuple_type, U>::value>();
}
template<typename U>
typename std::enable_if<
SPROUT_CXX14_CONSTEXPR typename std::enable_if<
sprout::types::find_index<tuple_type, U>::value != sizeof...(Types),
U&
>::type get() {
@ -334,7 +334,7 @@ namespace sprout {
;
}
template<typename Visitor>
typename visitor_result<typename std::remove_reference<Visitor>::type, variant>::type
SPROUT_CXX14_CONSTEXPR typename visitor_result<typename std::remove_reference<Visitor>::type, variant>::type
apply_visitor(Visitor&& visitor) {
typedef typename visitor_result<typename std::remove_reference<Visitor>::type, variant>::type result_type;
return SPROUT_ASSERT(0 <= which_ && sprout::math::less(which_, sizeof...(Types))),
@ -347,7 +347,7 @@ namespace sprout {
// swap
//
template<typename... Types>
inline void
inline SPROUT_CXX14_CONSTEXPR void
swap(sprout::variant<Types...>& lhs, sprout::variant<Types...>& rhs)
SPROUT_NOEXCEPT_EXPR(SPROUT_NOEXCEPT_EXPR(lhs.swap(rhs)))
{