[Liblas-devel] GetClassification() et al.

Mateusz Łoskot mateusz at loskot.net
Tue Oct 25 17:53:30 EDT 2011


2011/10/25 Peder Axensten <Peder.Axensten at slu.se>:
> I think we agree that Point.GetClassification() and Point.SetClassification( ... )
> should not filter the Classification in any way?

Yes.

> (I don't really understand why there are 3 SetClassification() as Classification
> has constructors to cover the other two cases, but never mind.)

The concept of classification is based on set of bits (flags).
We implemented it using std::bitset.
The set of constructors is defined to be a bit close to std::bitset,
with a bit of API discoverability in mind.

> I would think that the bug is that the right hand assignment expression of the various
> Point.SetClassification(...) is Classification(...).GetClass().

Yes.

> The correct would be static_cast<bitset>(Classification(...)) or something similar. Do you agree?

Nope.

I presented bug and fix here: https://gist.github.com/1313176

> As of retrieving all bits from a Classification object I had not noticed the operator bitset()
> member function. I guess static_cast<uint8_t>(static_cast<bitset>( p.GetClassification() ) )
> will work for me, with no execution overhead.

There is no conversion/cast from bitset to int.
You have to use bitset::to_ulong() function, then cast returned value
to uint8_t.
Here is long story step by step:

bitset<8> bits = p.GetClassification();
unsigned long ulong = bits.to_ulong();
uint8_t u8 = static_cast<uint8_t>(ulong);

You can do in one line:

static_cast<uint8_t>(bitset<8>(p.GetClassification()).to_ulong())

Note, here functional notation (which I prefer with user-defined types):
bitset<8>(p.GetClassification())
is equivalent to
static_cast<bitset<8>>(p.GetClassification())

> Although I'd be tempted to add an operator uint8_t() member function, for symmetry, as there is such a constructor.

No more conversion operators please, especially to uint8_t which would
increase ambiguity.
In fact, the bitset conversion operator should never make it to the
interface of Classification, IMHO.
(There are very good reasons why std::bitset does not provide
conversion operators!)

IMO, the Classification should follow bitset::to_ulong, namely it
could have Classification::to_uint8().

I'm leaving Howard with decision what approach to use here.

Best regards,
-- 
Mateusz Loskot, http://mateusz.loskot.net
Charter Member of OSGeo, http://osgeo.org
Member of ACCU, http://accu.org


More information about the Liblas-devel mailing list