Add StellarClass helpers for StarDB Ver. 0x0200 (Backport from 1.7)
Closes: #802 Due to emerge of Spectral_Ypull/821/head
parent
2075220600
commit
ba59db4a1d
|
@ -148,17 +148,37 @@ string StellarClass::str() const
|
|||
|
||||
|
||||
uint16
|
||||
StellarClass::pack() const
|
||||
StellarClass::packV1() const
|
||||
{
|
||||
// StarDB Ver. 0x0100 doesn't support Spectral_Y.
|
||||
// Classes following Spectral_Y are shifted by 1.
|
||||
uint16_t sc;
|
||||
if (specClass == Spectral_Y)
|
||||
sc = (uint16_t) Spectral_Unknown;
|
||||
else
|
||||
sc = (uint16_t) specClass > Spectral_Y ? specClass - 1 : specClass;
|
||||
|
||||
return (((uint16) starType << 12) |
|
||||
(((uint16) specClass & 0xf) << 8) |
|
||||
((uint16) subclass << 4) |
|
||||
((uint16) lumClass));
|
||||
(((uint16) sc & 0x0f) << 8) |
|
||||
((uint16) subclass << 4) |
|
||||
((uint16) lumClass));
|
||||
}
|
||||
|
||||
|
||||
uint16
|
||||
StellarClass::packV2() const
|
||||
{
|
||||
uint16_t sc = (starType == StellarClass::WhiteDwarf ? specClass - 1 : specClass);
|
||||
|
||||
return (((uint16) starType << 13) |
|
||||
(((uint16) sc & 0x1f) << 8) |
|
||||
(((uint16) subclass & 0x0f) << 4) |
|
||||
((uint16) lumClass & 0x0f));
|
||||
}
|
||||
|
||||
|
||||
bool
|
||||
StellarClass::unpack(uint16 st)
|
||||
StellarClass::unpackV1(uint16 st)
|
||||
{
|
||||
starType = static_cast<StellarClass::StarType>(st >> 12);
|
||||
|
||||
|
@ -166,6 +186,43 @@ StellarClass::unpack(uint16 st)
|
|||
{
|
||||
case NormalStar:
|
||||
specClass = static_cast<SpectralClass>(st >> 8 & 0xf);
|
||||
// StarDB Ver. 0x0100 doesn't support Spectral_Y
|
||||
// Spectral_Y has the value Spectral_C had earlier.
|
||||
if (specClass == Spectral_Y)
|
||||
specClass = Spectral_C;
|
||||
subclass = st >> 4 & 0xf;
|
||||
lumClass = static_cast<LuminosityClass>(st & 0xf);
|
||||
break;
|
||||
case WhiteDwarf:
|
||||
if ((st >> 8 & 0xf) >= WDClassCount)
|
||||
return false;
|
||||
specClass = static_cast<SpectralClass>((st >> 8 & 0xf) + Spectral_DA);
|
||||
subclass = st >> 4 & 0xf;
|
||||
lumClass = Lum_Unknown;
|
||||
break;
|
||||
case NeutronStar:
|
||||
case BlackHole:
|
||||
specClass = Spectral_Unknown;
|
||||
subclass = Subclass_Unknown;
|
||||
lumClass = Lum_Unknown;
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool
|
||||
StellarClass::unpackV2(uint16_t st)
|
||||
{
|
||||
starType = static_cast<StellarClass::StarType>(st >> 13);
|
||||
|
||||
switch (starType)
|
||||
{
|
||||
case NormalStar:
|
||||
specClass = static_cast<SpectralClass>(st >> 8 & 0x1f);
|
||||
subclass = st >> 4 & 0xf;
|
||||
lumClass = static_cast<LuminosityClass>(st & 0xf);
|
||||
break;
|
||||
|
@ -204,7 +261,7 @@ ostream& operator<<(ostream& os, const StellarClass& sc)
|
|||
|
||||
bool operator<(const StellarClass& sc0, const StellarClass& sc1)
|
||||
{
|
||||
return sc0.pack() < sc1.pack();
|
||||
return sc0.packV2() < sc1.packV2();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -105,8 +105,16 @@ public:
|
|||
|
||||
friend bool operator<(const StellarClass& sc0, const StellarClass& sc1);
|
||||
|
||||
uint16 pack() const;
|
||||
bool unpack(uint16);
|
||||
// methods for StarDB Ver. 0x0100
|
||||
uint16 packV1() const;
|
||||
bool unpackV1(uint16);
|
||||
|
||||
// methods for StarDB Ver. 0x0200
|
||||
uint16 packV2() const;
|
||||
bool unpackV2(uint16_t);
|
||||
|
||||
inline uint16 pack() const;
|
||||
inline bool unpack(uint16);
|
||||
|
||||
private:
|
||||
StarType starType;
|
||||
|
@ -162,4 +170,13 @@ StellarClass::LuminosityClass StellarClass::getLuminosityClass() const
|
|||
return lumClass;
|
||||
}
|
||||
|
||||
uint16 StellarClass::pack() const
|
||||
{
|
||||
return packV1();
|
||||
}
|
||||
bool StellarClass::unpack(uint16 t)
|
||||
{
|
||||
return unpackV1(t);
|
||||
}
|
||||
|
||||
#endif // _STELLARCLASS_H_
|
||||
|
|
Loading…
Reference in New Issue