|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r65911 - trunk/boost/gil
From: chhenning_at_[hidden]
Date: 2010-10-11 11:58:37
Author: chhenning
Date: 2010-10-11 11:58:35 EDT (Mon, 11 Oct 2010)
New Revision: 65911
URL: http://svn.boost.org/trac/boost/changeset/65911
Log:
Changes suppress compiler warnings when dealing with on-the-edge bit_aligned images, for instance rgb31 or rgb63.
Text files modified:
trunk/boost/gil/channel.hpp | 49 +++++++++++++++++++++++++++++++--------
1 files changed, 38 insertions(+), 11 deletions(-)
Modified: trunk/boost/gil/channel.hpp
==============================================================================
--- trunk/boost/gil/channel.hpp (original)
+++ trunk/boost/gil/channel.hpp 2010-10-11 11:58:35 EDT (Mon, 11 Oct 2010)
@@ -208,6 +208,18 @@
>::type
>::type
> {};
+
+ template <int NumBits>
+ struct num_value_fn : public mpl::if_c< ( NumBits < 32 )
+ , uint32_t
+ , uint64_t
+ > {};
+
+ template <int NumBits>
+ struct max_value_fn : public mpl::if_c< ( NumBits <= 32 )
+ , uint32_t
+ , uint64_t
+ > {};
}
/**
@@ -230,10 +242,14 @@
/// \brief The value of a subbyte channel. Models: ChannelValueConcept
template <int NumBits>
class packed_channel_value {
- static const std::size_t num_values = 1<<NumBits;
+
+ typedef typename detail::num_value_fn< NumBits >::type num_value_t;
+ static const num_value_t num_values = static_cast< num_value_t >( 1 ) << NumBits ;
+
public:
typedef typename detail::min_fast_uint<NumBits>::type integer_t;
+
typedef packed_channel_value value_type;
typedef value_type& reference;
typedef const value_type& const_reference;
@@ -245,9 +261,12 @@
BOOST_STATIC_CONSTANT(bool, is_mutable=true);
packed_channel_value() {}
- packed_channel_value(integer_t v) : _value(v % num_values) {}
+ packed_channel_value(integer_t v) { _value = static_cast< integer_t >( v % num_values ); }
packed_channel_value(const packed_channel_value& v) : _value(v._value) {}
- template <typename Scalar> packed_channel_value(Scalar v) : _value(integer_t(v) % num_values) {} // suppress GCC implicit conversion warnings in channel regression file
+ template <typename Scalar> packed_channel_value(Scalar v) { _value = static_cast< integer_t >( v ) % num_values; }
+
+ static unsigned int num_bits() { return NumBits; }
+
operator integer_t() const { return _value; }
private:
@@ -307,8 +326,13 @@
operator integer_t() const { return get(); }
data_ptr_t operator &() const {return _data_ptr;}
protected:
- static const integer_t max_val = (1<<NumBits) - 1;
+ typedef typename detail::num_value_fn< NumBits >::type num_value_t;
+ typedef typename detail::max_value_fn< NumBits >::type max_value_t;
+
+ static const num_value_t num_values = static_cast< num_value_t >( 1 ) << NumBits ;
+ static const max_value_t max_val = static_cast< max_value_t >( num_values - 1 );
+
#ifdef GIL_NONWORD_POINTER_ALIGNMENT_SUPPORTED
const bitfield_t& get_data() const { return *static_cast<const bitfield_t*>(_data_ptr); }
void set_data(const bitfield_t& val) const { *static_cast< bitfield_t*>(_data_ptr) = val; }
@@ -368,6 +392,7 @@
friend class packed_channel_reference<BitField,FirstBit,NumBits,true>;
static const BitField channel_mask = static_cast< BitField >( parent_t::max_val ) << FirstBit;
+
void operator=(const packed_channel_reference&);
public:
typedef const packed_channel_reference<BitField,FirstBit,NumBits,false> const_reference;
@@ -392,6 +417,7 @@
friend class packed_channel_reference<BitField,FirstBit,NumBits,false>;
static const BitField channel_mask = static_cast< BitField >( parent_t::max_val ) << FirstBit;
+
public:
typedef const packed_channel_reference<BitField,FirstBit,NumBits,false> const_reference;
typedef const packed_channel_reference<BitField,FirstBit,NumBits,true> mutable_reference;
@@ -409,8 +435,8 @@
unsigned first_bit() const { return FirstBit; }
- integer_t get() const { return integer_t((this->get_data()&channel_mask) >> FirstBit); }
- void set_unsafe(integer_t value) const { this->set_data((this->get_data() & ~channel_mask) | (( static_cast< BitField >( value )<<FirstBit))); }
+ integer_t get() const { return integer_t((this->get_data()&channel_mask) >> FirstBit); }
+ void set_unsafe(integer_t value) const { this->set_data((this->get_data() & ~channel_mask) | (( static_cast< BitField >( value )<<FirstBit))); }
private:
void set_from_reference(const BitField& other_bits) const { this->set_data((this->get_data() & ~channel_mask) | (other_bits & channel_mask)); }
};
@@ -491,8 +517,8 @@
unsigned first_bit() const { return _first_bit; }
integer_t get() const {
- const BitField channel_mask = parent_t::max_val<<_first_bit;
- return static_cast< integer_t >(( this->get_data() & channel_mask ) >> _first_bit);
+ const BitField channel_mask = static_cast< integer_t >( parent_t::max_val ) <<_first_bit;
+ return static_cast< integer_t >(( this->get_data()&channel_mask ) >> _first_bit );
}
};
@@ -526,11 +552,12 @@
unsigned first_bit() const { return _first_bit; }
integer_t get() const {
- const BitField channel_mask = parent_t::max_val<<_first_bit;
- return static_cast< integer_t >(( this->get_data() & channel_mask ) >> _first_bit );
+ const BitField channel_mask = static_cast< integer_t >( parent_t::max_val ) << _first_bit;
+ return static_cast< integer_t >(( this->get_data()&channel_mask ) >> _first_bit );
}
+
void set_unsafe(integer_t value) const {
- const BitField channel_mask = parent_t::max_val<<_first_bit;
+ const BitField channel_mask = static_cast< integer_t >( parent_t::max_val ) << _first_bit;
this->set_data((this->get_data() & ~channel_mask) | value<<_first_bit);
}
};
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk