Bug 987305 - Refactor EnumSerializer - r=nfroyd

This commit is contained in:
Benoit Jacob 2014-04-14 10:17:40 -04:00
parent beb6652b55
commit e8b418c5f5
11 changed files with 246 additions and 186 deletions

View File

@ -157,9 +157,9 @@ namespace IPC {
template <>
struct ParamTraits<mozilla::dom::asmjscache::OpenMode> :
public EnumSerializer<mozilla::dom::asmjscache::OpenMode,
mozilla::dom::asmjscache::eOpenForRead,
mozilla::dom::asmjscache::NUM_OPEN_MODES>
public ContiguousEnumSerializer<mozilla::dom::asmjscache::OpenMode,
mozilla::dom::asmjscache::eOpenForRead,
mozilla::dom::asmjscache::NUM_OPEN_MODES>
{ };
template <>

View File

@ -14,9 +14,10 @@ namespace IPC {
template <>
struct ParamTraits<mozilla::dom::bluetooth::BluetoothObjectType>
: public EnumSerializer<mozilla::dom::bluetooth::BluetoothObjectType,
mozilla::dom::bluetooth::TYPE_MANAGER,
mozilla::dom::bluetooth::TYPE_INVALID>
: public ContiguousEnumSerializer<
mozilla::dom::bluetooth::BluetoothObjectType,
mozilla::dom::bluetooth::TYPE_MANAGER,
mozilla::dom::bluetooth::TYPE_INVALID>
{ };
} // namespace IPC

View File

@ -17,9 +17,10 @@ namespace IPC {
template <>
struct ParamTraits<mozilla::dom::quota::PersistenceType> :
public EnumSerializer<mozilla::dom::quota::PersistenceType,
mozilla::dom::quota::PERSISTENCE_TYPE_PERSISTENT,
mozilla::dom::quota::PERSISTENCE_TYPE_INVALID>
public ContiguousEnumSerializer<
mozilla::dom::quota::PersistenceType,
mozilla::dom::quota::PERSISTENCE_TYPE_PERSISTENT,
mozilla::dom::quota::PERSISTENCE_TYPE_INVALID>
{ };
template <>
@ -45,9 +46,10 @@ struct ParamTraits<mozilla::dom::indexedDB::Key>
template <>
struct ParamTraits<mozilla::dom::indexedDB::KeyPath::KeyPathType> :
public EnumSerializer<mozilla::dom::indexedDB::KeyPath::KeyPathType,
mozilla::dom::indexedDB::KeyPath::NONEXISTENT,
mozilla::dom::indexedDB::KeyPath::ENDGUARD>
public ContiguousEnumSerializer<
mozilla::dom::indexedDB::KeyPath::KeyPathType,
mozilla::dom::indexedDB::KeyPath::NONEXISTENT,
mozilla::dom::indexedDB::KeyPath::ENDGUARD>
{ };
template <>
@ -75,16 +77,18 @@ struct ParamTraits<mozilla::dom::indexedDB::KeyPath>
template <>
struct ParamTraits<mozilla::dom::indexedDB::IDBCursor::Direction> :
public EnumSerializer<mozilla::dom::indexedDB::IDBCursor::Direction,
mozilla::dom::indexedDB::IDBCursor::NEXT,
mozilla::dom::indexedDB::IDBCursor::DIRECTION_INVALID>
public ContiguousEnumSerializer<
mozilla::dom::indexedDB::IDBCursor::Direction,
mozilla::dom::indexedDB::IDBCursor::NEXT,
mozilla::dom::indexedDB::IDBCursor::DIRECTION_INVALID>
{ };
template <>
struct ParamTraits<mozilla::dom::indexedDB::IDBTransaction::Mode> :
public EnumSerializer<mozilla::dom::indexedDB::IDBTransaction::Mode,
mozilla::dom::indexedDB::IDBTransaction::READ_ONLY,
mozilla::dom::indexedDB::IDBTransaction::MODE_INVALID>
public ContiguousEnumSerializer<
mozilla::dom::indexedDB::IDBTransaction::Mode,
mozilla::dom::indexedDB::IDBTransaction::READ_ONLY,
mozilla::dom::indexedDB::IDBTransaction::MODE_INVALID>
{ };
template <>

View File

@ -90,9 +90,9 @@ struct ParamTraits<mozilla::dom::AudioChannel>
template <>
struct ParamTraits<mozilla::dom::AudioChannelState>
: public EnumSerializer<mozilla::dom::AudioChannelState,
mozilla::dom::AUDIO_CHANNEL_STATE_NORMAL,
mozilla::dom::AUDIO_CHANNEL_STATE_LAST>
: public ContiguousEnumSerializer<mozilla::dom::AudioChannelState,
mozilla::dom::AUDIO_CHANNEL_STATE_NORMAL,
mozilla::dom::AUDIO_CHANNEL_STATE_LAST>
{ };
}

View File

@ -87,9 +87,10 @@ namespace IPC {
*/
template <>
struct ParamTraits<mozilla::dom::mobilemessage::DeliveryState>
: public EnumSerializer<mozilla::dom::mobilemessage::DeliveryState,
mozilla::dom::mobilemessage::eDeliveryState_Sent,
mozilla::dom::mobilemessage::eDeliveryState_EndGuard>
: public ContiguousEnumSerializer<
mozilla::dom::mobilemessage::DeliveryState,
mozilla::dom::mobilemessage::eDeliveryState_Sent,
mozilla::dom::mobilemessage::eDeliveryState_EndGuard>
{};
/**
@ -97,9 +98,10 @@ struct ParamTraits<mozilla::dom::mobilemessage::DeliveryState>
*/
template <>
struct ParamTraits<mozilla::dom::mobilemessage::DeliveryStatus>
: public EnumSerializer<mozilla::dom::mobilemessage::DeliveryStatus,
mozilla::dom::mobilemessage::eDeliveryStatus_NotApplicable,
mozilla::dom::mobilemessage::eDeliveryStatus_EndGuard>
: public ContiguousEnumSerializer<
mozilla::dom::mobilemessage::DeliveryStatus,
mozilla::dom::mobilemessage::eDeliveryStatus_NotApplicable,
mozilla::dom::mobilemessage::eDeliveryStatus_EndGuard>
{};
/**
@ -107,9 +109,10 @@ struct ParamTraits<mozilla::dom::mobilemessage::DeliveryStatus>
*/
template <>
struct ParamTraits<mozilla::dom::mobilemessage::ReadStatus>
: public EnumSerializer<mozilla::dom::mobilemessage::ReadStatus,
mozilla::dom::mobilemessage::eReadStatus_NotApplicable,
mozilla::dom::mobilemessage::eReadStatus_EndGuard>
: public ContiguousEnumSerializer<
mozilla::dom::mobilemessage::ReadStatus,
mozilla::dom::mobilemessage::eReadStatus_NotApplicable,
mozilla::dom::mobilemessage::eReadStatus_EndGuard>
{};
/**
@ -117,9 +120,10 @@ struct ParamTraits<mozilla::dom::mobilemessage::ReadStatus>
*/
template <>
struct ParamTraits<mozilla::dom::mobilemessage::ReadState>
: public EnumSerializer<mozilla::dom::mobilemessage::ReadState,
mozilla::dom::mobilemessage::eReadState_Unknown,
mozilla::dom::mobilemessage::eReadState_EndGuard>
: public ContiguousEnumSerializer<
mozilla::dom::mobilemessage::ReadState,
mozilla::dom::mobilemessage::eReadState_Unknown,
mozilla::dom::mobilemessage::eReadState_EndGuard>
{};
/**
@ -127,9 +131,10 @@ struct ParamTraits<mozilla::dom::mobilemessage::ReadState>
*/
template <>
struct ParamTraits<mozilla::dom::mobilemessage::MessageClass>
: public EnumSerializer<mozilla::dom::mobilemessage::MessageClass,
mozilla::dom::mobilemessage::eMessageClass_Normal,
mozilla::dom::mobilemessage::eMessageClass_EndGuard>
: public ContiguousEnumSerializer<
mozilla::dom::mobilemessage::MessageClass,
mozilla::dom::mobilemessage::eMessageClass_Normal,
mozilla::dom::mobilemessage::eMessageClass_EndGuard>
{};
/**
@ -137,9 +142,10 @@ struct ParamTraits<mozilla::dom::mobilemessage::MessageClass>
*/
template <>
struct ParamTraits<mozilla::dom::mobilemessage::MessageType>
: public EnumSerializer<mozilla::dom::mobilemessage::MessageType,
mozilla::dom::mobilemessage::eMessageType_SMS,
mozilla::dom::mobilemessage::eMessageType_EndGuard>
: public ContiguousEnumSerializer<
mozilla::dom::mobilemessage::MessageType,
mozilla::dom::mobilemessage::eMessageType_SMS,
mozilla::dom::mobilemessage::eMessageType_EndGuard>
{};
} // namespace IPC

View File

@ -244,72 +244,82 @@ struct ParamTraits<gfx3DMatrix>
template <>
struct ParamTraits<gfxContentType>
: public TypedEnumSerializer<gfxContentType,
gfxContentType::COLOR,
gfxContentType::SENTINEL>
: public ContiguousTypedEnumSerializer<
gfxContentType,
gfxContentType::COLOR,
gfxContentType::SENTINEL>
{};
template <>
struct ParamTraits<gfxSurfaceType>
: public TypedEnumSerializer<gfxSurfaceType,
gfxSurfaceType::Image,
gfxSurfaceType::Max>
: public ContiguousTypedEnumSerializer<
gfxSurfaceType,
gfxSurfaceType::Image,
gfxSurfaceType::Max>
{};
template <>
struct ParamTraits<mozilla::GraphicsFilterType>
: public EnumSerializer<mozilla::GraphicsFilterType,
GraphicsFilter::FILTER_FAST,
GraphicsFilter::FILTER_SENTINEL>
: public ContiguousEnumSerializer<
mozilla::GraphicsFilterType,
GraphicsFilter::FILTER_FAST,
GraphicsFilter::FILTER_SENTINEL>
{};
template <>
struct ParamTraits<mozilla::layers::LayersBackend>
: public TypedEnumSerializer<mozilla::layers::LayersBackend,
mozilla::layers::LayersBackend::LAYERS_NONE,
mozilla::layers::LayersBackend::LAYERS_LAST>
: public ContiguousTypedEnumSerializer<
mozilla::layers::LayersBackend,
mozilla::layers::LayersBackend::LAYERS_NONE,
mozilla::layers::LayersBackend::LAYERS_LAST>
{};
template <>
struct ParamTraits<mozilla::layers::ScaleMode>
: public TypedEnumSerializer<mozilla::layers::ScaleMode,
mozilla::layers::ScaleMode::SCALE_NONE,
mozilla::layers::ScaleMode::SENTINEL>
: public ContiguousTypedEnumSerializer<
mozilla::layers::ScaleMode,
mozilla::layers::ScaleMode::SCALE_NONE,
mozilla::layers::ScaleMode::SENTINEL>
{};
template <>
struct ParamTraits<gfxImageFormat>
: public TypedEnumSerializer<gfxImageFormat,
gfxImageFormat::ARGB32,
gfxImageFormat::Unknown>
: public ContiguousTypedEnumSerializer<
gfxImageFormat,
gfxImageFormat::ARGB32,
gfxImageFormat::Unknown>
{};
template <>
struct ParamTraits<mozilla::gfx::AttributeName>
: public EnumSerializer<mozilla::gfx::AttributeName,
mozilla::gfx::eBlendBlendmode,
mozilla::gfx::eLastAttributeName>
: public ContiguousEnumSerializer<
mozilla::gfx::AttributeName,
mozilla::gfx::eBlendBlendmode,
mozilla::gfx::eLastAttributeName>
{};
template <>
struct ParamTraits<mozilla::gfx::AttributeType>
: public TypedEnumSerializer<mozilla::gfx::AttributeType,
mozilla::gfx::AttributeType::eBool,
mozilla::gfx::AttributeType::Max>
: public ContiguousTypedEnumSerializer<
mozilla::gfx::AttributeType,
mozilla::gfx::AttributeType::eBool,
mozilla::gfx::AttributeType::Max>
{};
template <>
struct ParamTraits<mozilla::gfx::PrimitiveType>
: public TypedEnumSerializer<mozilla::gfx::PrimitiveType,
mozilla::gfx::PrimitiveType::Empty,
mozilla::gfx::PrimitiveType::Max>
: public ContiguousTypedEnumSerializer<
mozilla::gfx::PrimitiveType,
mozilla::gfx::PrimitiveType::Empty,
mozilla::gfx::PrimitiveType::Max>
{};
template <>
struct ParamTraits<mozilla::gfx::ColorSpace>
: public TypedEnumSerializer<mozilla::gfx::ColorSpace,
mozilla::gfx::ColorSpace::SRGB,
mozilla::gfx::ColorSpace::Max>
: public ContiguousTypedEnumSerializer<
mozilla::gfx::ColorSpace,
mozilla::gfx::ColorSpace::SRGB,
mozilla::gfx::ColorSpace::Max>
{};
/*
@ -798,16 +808,18 @@ struct ParamTraits<mozilla::layers::TextureInfo>
template <>
struct ParamTraits<mozilla::layers::CompositableType>
: public EnumSerializer<mozilla::layers::CompositableType,
mozilla::layers::BUFFER_UNKNOWN,
mozilla::layers::BUFFER_COUNT>
: public ContiguousEnumSerializer<
mozilla::layers::CompositableType,
mozilla::layers::BUFFER_UNKNOWN,
mozilla::layers::BUFFER_COUNT>
{};
template <>
struct ParamTraits<mozilla::gfx::SurfaceFormat>
: public TypedEnumSerializer<mozilla::gfx::SurfaceFormat,
mozilla::gfx::SurfaceFormat::B8G8R8A8,
mozilla::gfx::SurfaceFormat::UNKNOWN>
: public ContiguousTypedEnumSerializer<
mozilla::gfx::SurfaceFormat,
mozilla::gfx::SurfaceFormat::B8G8R8A8,
mozilla::gfx::SurfaceFormat::UNKNOWN>
{};
template <>

View File

@ -86,9 +86,10 @@ struct ParamTraits<mozilla::layers::MagicGrallocBufferHandle> {
template <>
struct ParamTraits<mozilla::ScreenRotation>
: public EnumSerializer<mozilla::ScreenRotation,
mozilla::ROTATION_0,
mozilla::ROTATION_COUNT>
: public ContiguousEnumSerializer<
mozilla::ScreenRotation,
mozilla::ROTATION_0,
mozilla::ROTATION_COUNT>
{};
} // namespace IPC

View File

@ -58,16 +58,18 @@ namespace IPC {
*/
template <>
struct ParamTraits<mozilla::hal::SensorType>:
public EnumSerializer<mozilla::hal::SensorType,
mozilla::hal::SENSOR_UNKNOWN,
mozilla::hal::NUM_SENSOR_TYPE> {
public ContiguousEnumSerializer<
mozilla::hal::SensorType,
mozilla::hal::SENSOR_UNKNOWN,
mozilla::hal::NUM_SENSOR_TYPE> {
};
template <>
struct ParamTraits<mozilla::hal::SensorAccuracyType>:
public EnumSerializer<mozilla::hal::SensorAccuracyType,
mozilla::hal::SENSOR_ACCURACY_UNKNOWN,
mozilla::hal::NUM_SENSOR_ACCURACY_TYPE> {
public ContiguousEnumSerializer<
mozilla::hal::SensorAccuracyType,
mozilla::hal::SENSOR_ACCURACY_UNKNOWN,
mozilla::hal::NUM_SENSOR_ACCURACY_TYPE> {
};
} // namespace IPC

View File

@ -212,9 +212,10 @@ namespace IPC {
*/
template <>
struct ParamTraits<mozilla::hal::LightType>
: public EnumSerializer<mozilla::hal::LightType,
mozilla::hal::eHalLightID_Backlight,
mozilla::hal::eHalLightID_Count>
: public ContiguousEnumSerializer<
mozilla::hal::LightType,
mozilla::hal::eHalLightID_Backlight,
mozilla::hal::eHalLightID_Count>
{};
/**
@ -222,9 +223,10 @@ struct ParamTraits<mozilla::hal::LightType>
*/
template <>
struct ParamTraits<mozilla::hal::LightMode>
: public EnumSerializer<mozilla::hal::LightMode,
mozilla::hal::eHalLightMode_User,
mozilla::hal::eHalLightMode_Count>
: public ContiguousEnumSerializer<
mozilla::hal::LightMode,
mozilla::hal::eHalLightMode_User,
mozilla::hal::eHalLightMode_Count>
{};
/**
@ -232,9 +234,10 @@ struct ParamTraits<mozilla::hal::LightMode>
*/
template <>
struct ParamTraits<mozilla::hal::FlashMode>
: public EnumSerializer<mozilla::hal::FlashMode,
mozilla::hal::eHalLightFlash_None,
mozilla::hal::eHalLightFlash_Count>
: public ContiguousEnumSerializer<
mozilla::hal::FlashMode,
mozilla::hal::eHalLightFlash_None,
mozilla::hal::eHalLightFlash_Count>
{};
/**
@ -242,9 +245,10 @@ struct ParamTraits<mozilla::hal::FlashMode>
*/
template <>
struct ParamTraits<mozilla::hal::ShutdownMode>
: public EnumSerializer<mozilla::hal::ShutdownMode,
mozilla::hal::eHalShutdownMode_Unknown,
mozilla::hal::eHalShutdownMode_Count>
: public ContiguousEnumSerializer<
mozilla::hal::ShutdownMode,
mozilla::hal::eHalShutdownMode_Unknown,
mozilla::hal::eHalShutdownMode_Count>
{};
/**
@ -252,9 +256,10 @@ struct ParamTraits<mozilla::hal::ShutdownMode>
*/
template <>
struct ParamTraits<mozilla::hal::WakeLockControl>
: public EnumSerializer<mozilla::hal::WakeLockControl,
mozilla::hal::WAKE_LOCK_REMOVE_ONE,
mozilla::hal::NUM_WAKE_LOCK>
: public ContiguousEnumSerializer<
mozilla::hal::WakeLockControl,
mozilla::hal::WAKE_LOCK_REMOVE_ONE,
mozilla::hal::NUM_WAKE_LOCK>
{};
/**
@ -262,9 +267,10 @@ struct ParamTraits<mozilla::hal::WakeLockControl>
*/
template <>
struct ParamTraits<mozilla::hal::SwitchState>:
public EnumSerializer<mozilla::hal::SwitchState,
mozilla::hal::SWITCH_STATE_UNKNOWN,
mozilla::hal::NUM_SWITCH_STATE> {
public ContiguousEnumSerializer<
mozilla::hal::SwitchState,
mozilla::hal::SWITCH_STATE_UNKNOWN,
mozilla::hal::NUM_SWITCH_STATE> {
};
/**
@ -272,16 +278,18 @@ struct ParamTraits<mozilla::hal::SwitchState>:
*/
template <>
struct ParamTraits<mozilla::hal::SwitchDevice>:
public EnumSerializer<mozilla::hal::SwitchDevice,
mozilla::hal::SWITCH_DEVICE_UNKNOWN,
mozilla::hal::NUM_SWITCH_DEVICE> {
public ContiguousEnumSerializer<
mozilla::hal::SwitchDevice,
mozilla::hal::SWITCH_DEVICE_UNKNOWN,
mozilla::hal::NUM_SWITCH_DEVICE> {
};
template <>
struct ParamTraits<mozilla::hal::ProcessPriority>:
public EnumSerializer<mozilla::hal::ProcessPriority,
mozilla::hal::PROCESS_PRIORITY_UNKNOWN,
mozilla::hal::NUM_PROCESS_PRIORITY> {
public ContiguousEnumSerializer<
mozilla::hal::ProcessPriority,
mozilla::hal::PROCESS_PRIORITY_UNKNOWN,
mozilla::hal::NUM_PROCESS_PRIORITY> {
};
/**
@ -289,9 +297,10 @@ struct ParamTraits<mozilla::hal::ProcessPriority>:
*/
template <>
struct ParamTraits<mozilla::hal::FMRadioOperation>:
public EnumSerializer<mozilla::hal::FMRadioOperation,
mozilla::hal::FM_RADIO_OPERATION_UNKNOWN,
mozilla::hal::NUM_FM_RADIO_OPERATION>
public ContiguousEnumSerializer<
mozilla::hal::FMRadioOperation,
mozilla::hal::FM_RADIO_OPERATION_UNKNOWN,
mozilla::hal::NUM_FM_RADIO_OPERATION>
{};
/**
@ -299,9 +308,10 @@ struct ParamTraits<mozilla::hal::FMRadioOperation>:
*/
template <>
struct ParamTraits<mozilla::hal::FMRadioOperationStatus>:
public EnumSerializer<mozilla::hal::FMRadioOperationStatus,
mozilla::hal::FM_RADIO_OPERATION_STATUS_UNKNOWN,
mozilla::hal::NUM_FM_RADIO_OPERATION_STATUS>
public ContiguousEnumSerializer<
mozilla::hal::FMRadioOperationStatus,
mozilla::hal::FM_RADIO_OPERATION_STATUS_UNKNOWN,
mozilla::hal::NUM_FM_RADIO_OPERATION_STATUS>
{};
/**
@ -309,9 +319,10 @@ struct ParamTraits<mozilla::hal::FMRadioOperationStatus>:
*/
template <>
struct ParamTraits<mozilla::hal::FMRadioSeekDirection>:
public EnumSerializer<mozilla::hal::FMRadioSeekDirection,
mozilla::hal::FM_RADIO_SEEK_DIRECTION_UNKNOWN,
mozilla::hal::NUM_FM_RADIO_SEEK_DIRECTION>
public ContiguousEnumSerializer<
mozilla::hal::FMRadioSeekDirection,
mozilla::hal::FM_RADIO_SEEK_DIRECTION_UNKNOWN,
mozilla::hal::NUM_FM_RADIO_SEEK_DIRECTION>
{};
/**
@ -319,10 +330,12 @@ struct ParamTraits<mozilla::hal::FMRadioSeekDirection>:
**/
template <>
struct ParamTraits<mozilla::hal::FMRadioCountry>:
public EnumSerializer<mozilla::hal::FMRadioCountry,
mozilla::hal::FM_RADIO_COUNTRY_UNKNOWN,
mozilla::hal::NUM_FM_RADIO_COUNTRY>
public ContiguousEnumSerializer<
mozilla::hal::FMRadioCountry,
mozilla::hal::FM_RADIO_COUNTRY_UNKNOWN,
mozilla::hal::NUM_FM_RADIO_COUNTRY>
{};
} // namespace IPC
#endif // mozilla_hal_Types_h

View File

@ -16,6 +16,7 @@
#include "mozilla/TimeStamp_windows.h"
#endif
#include "mozilla/TypedEnum.h"
#include "mozilla/IntegerTypeTraits.h"
#include <stdint.h>
@ -91,43 +92,31 @@ namespace IPC {
/**
* Generic enum serializer.
*
* Consider using the specializations below, such as ContiguousEnumSerializer.
*
* This is a generic serializer for any enum type used in IPDL.
* Programmers can define ParamTraits<E> for enum type E by deriving
* EnumSerializer<E, smallestLegal, highGuard>.
*
* The serializer would check value againts a range specified by
* smallestLegal and highGuard. Only values from smallestLegal to
* highGuard are valid, include smallestLegal but highGuard.
*
* For example, following is definition of serializer for enum type FOO.
* \code
* enum FOO { FOO_FIRST, FOO_SECOND, FOO_LAST, NUM_FOO };
*
* template <>
* struct ParamTraits<FOO>:
* public EnumSerializer<FOO, FOO_FIRST, NUM_FOO> {};
* \endcode
* FOO_FIRST, FOO_SECOND, and FOO_LAST are valid value.
* EnumSerializer<E, MyEnumValidator> where MyEnumValidator is a struct
* that has to define a static IsLegalValue function returning whether
* a given value is a legal value of the enum type at hand.
*
* \sa https://developer.mozilla.org/en/IPDL/Type_Serialization
*/
template <typename E, E smallestLegal, E highBound>
template <typename E, typename EnumValidator>
struct EnumSerializer {
typedef E paramType;
static bool IsLegalValue(const paramType &aValue) {
return smallestLegal <= aValue && aValue < highBound;
}
typedef typename mozilla::UnsignedStdintTypeForSize<sizeof(paramType)>::Type
uintParamType;
static void Write(Message* aMsg, const paramType& aValue) {
MOZ_ASSERT(IsLegalValue(aValue));
WriteParam(aMsg, (int32_t)aValue);
MOZ_ASSERT(EnumValidator::IsLegalValue(aValue));
WriteParam(aMsg, uintParamType(aValue));
}
static bool Read(const Message* aMsg, void** aIter, paramType* aResult) {
int32_t value;
uintParamType value;
if(!ReadParam(aMsg, aIter, &value) ||
!IsLegalValue(paramType(value))) {
!EnumValidator::IsLegalValue(paramType(value))) {
return false;
}
*aResult = paramType(value);
@ -135,48 +124,79 @@ struct EnumSerializer {
}
};
/**
* Variant of EnumSerializer for MFBT's typed enums
* defined by MOZ_BEGIN_ENUM_CLASS in mfbt/TypedEnum.h
*
* This is only needed on non-C++11 compilers such as B2G's GCC 4.4,
* where MOZ_BEGIN_ENUM_CLASS is implemented using a nested enum, T::Enum,
* in a wrapper class T. In this case, the "typed enum" type T cannot be
* used as an integer template parameter type. MOZ_TEMPLATE_ENUM_CLASS_ENUM_TYPE(T)
* is how we get at the integer enum type.
*/
template <typename E,
MOZ_TEMPLATE_ENUM_CLASS_ENUM_TYPE(E) smallestLegal,
MOZ_TEMPLATE_ENUM_CLASS_ENUM_TYPE(E) highBound>
struct TypedEnumSerializer {
typedef E paramType;
typedef MOZ_TEMPLATE_ENUM_CLASS_ENUM_TYPE(E) intParamType;
static bool IsLegalValue(const paramType &aValue) {
return smallestLegal <= intParamType(aValue) && intParamType(aValue) < highBound;
}
static void Write(Message* aMsg, const paramType& aValue) {
MOZ_ASSERT(IsLegalValue(aValue));
WriteParam(aMsg, int32_t(intParamType(aValue)));
}
static bool Read(const Message* aMsg, void** aIter, paramType* aResult) {
int32_t value;
if(!ReadParam(aMsg, aIter, &value) ||
!IsLegalValue(intParamType(value))) {
return false;
}
*aResult = intParamType(value);
return true;
E MinLegal,
E HighBound>
struct ContiguousEnumValidator
{
static bool IsLegalValue(E e)
{
return MinLegal <= e && e < HighBound;
}
};
template <typename E,
MOZ_TEMPLATE_ENUM_CLASS_ENUM_TYPE(E) MinLegal,
MOZ_TEMPLATE_ENUM_CLASS_ENUM_TYPE(E) HighBound>
class ContiguousTypedEnumValidator
{
// Silence overzealous -Wtype-limits bug in GCC fixed in GCC 4.8:
// "comparison of unsigned expression >= 0 is always true"
// http://gcc.gnu.org/bugzilla/show_bug.cgi?id=11856
template <typename T>
static bool IsLessThanOrEqual(T a, T b) { return a <= b; }
public:
static bool IsLegalValue(E e)
{
typedef MOZ_TEMPLATE_ENUM_CLASS_ENUM_TYPE(E) ActualEnumType;
return IsLessThanOrEqual(MinLegal, ActualEnumType(e)) &&
ActualEnumType(e) < HighBound;
}
};
/**
* Specialization of EnumSerializer for enums with contiguous enum values.
*
* Provide two values: MinLegal, HighBound. An enum value x will be
* considered legal if MinLegal <= x < HighBound.
*
* For example, following is definition of serializer for enum type FOO.
* \code
* enum FOO { FOO_FIRST, FOO_SECOND, FOO_LAST, NUM_FOO };
*
* template <>
* struct ParamTraits<FOO>:
* public ContiguousEnumSerializer<FOO, FOO_FIRST, NUM_FOO> {};
* \endcode
* FOO_FIRST, FOO_SECOND, and FOO_LAST are valid value.
*/
template <typename E,
E MinLegal,
E HighBound>
struct ContiguousEnumSerializer
: EnumSerializer<E,
ContiguousEnumValidator<E, MinLegal, HighBound>>
{};
/**
* Similar to ContiguousEnumSerializer, but for MFBT typed enums
* as constructed by MOZ_BEGIN_ENUM_CLASS. This can go away when
* we drop MOZ_BEGIN_ENUM_CLASS and use C++11 enum classes directly.
*/
template <typename E,
MOZ_TEMPLATE_ENUM_CLASS_ENUM_TYPE(E) MinLegal,
MOZ_TEMPLATE_ENUM_CLASS_ENUM_TYPE(E) HighBound>
struct ContiguousTypedEnumSerializer
: EnumSerializer<E,
ContiguousTypedEnumValidator<E, MinLegal, HighBound>>
{};
template <>
struct ParamTraits<base::ChildPrivileges>
: public EnumSerializer<base::ChildPrivileges,
base::PRIVILEGES_DEFAULT,
base::PRIVILEGES_LAST>
: public ContiguousEnumSerializer<base::ChildPrivileges,
base::PRIVILEGES_DEFAULT,
base::PRIVILEGES_LAST>
{ };
template<>
@ -477,9 +497,9 @@ struct ParamTraits<float>
template <>
struct ParamTraits<nsCSSProperty>
: public EnumSerializer<nsCSSProperty,
eCSSProperty_UNKNOWN,
eCSSProperty_COUNT>
: public ContiguousEnumSerializer<nsCSSProperty,
eCSSProperty_UNKNOWN,
eCSSProperty_COUNT>
{};
template<>

View File

@ -35,9 +35,10 @@ namespace IPC {
template <>
struct ParamTraits<mozilla::layout::ScrollingBehavior>
: public EnumSerializer<mozilla::layout::ScrollingBehavior,
mozilla::layout::DEFAULT_SCROLLING,
mozilla::layout::SCROLLING_BEHAVIOR_SENTINEL>
: public ContiguousEnumSerializer<
mozilla::layout::ScrollingBehavior,
mozilla::layout::DEFAULT_SCROLLING,
mozilla::layout::SCROLLING_BEHAVIOR_SENTINEL>
{};
} // namespace IPC