Browse Source

typed arrays: replace switch with templates

Convert TypedArray's TypeName implementation to template specialization
instead of a switch() statement.
v0.9.6-release
Dean McNamee 12 years ago
committed by Ben Noordhuis
parent
commit
b50d51ef5b
  1. 43
      src/v8_typed_array.cc

43
src/v8_typed_array.cc

@ -172,6 +172,30 @@ static bool checkAlignment(size_t val, unsigned int bytes) {
return (val & (bytes - 1)) == 0; // Handles bytes == 0. return (val & (bytes - 1)) == 0; // Handles bytes == 0.
} }
template <v8::ExternalArrayType TEAType>
struct TEANameTrait {
static const char* const name;
};
template <> const char* const
TEANameTrait<v8::kExternalByteArray>::name = "Int8Array";
template <> const char* const
TEANameTrait<v8::kExternalUnsignedByteArray>::name = "Uint8Array";
template <> const char* const
TEANameTrait<v8::kExternalPixelArray>::name = "Uint8ClampedArray";
template <> const char* const
TEANameTrait<v8::kExternalShortArray>::name = "Int16Array";
template <> const char* const
TEANameTrait<v8::kExternalUnsignedShortArray>::name = "Uint16Array";
template <> const char* const
TEANameTrait<v8::kExternalIntArray>::name = "Int32Array";
template <> const char* const
TEANameTrait<v8::kExternalUnsignedIntArray>::name = "Uint32Array";
template <> const char* const
TEANameTrait<v8::kExternalFloatArray>::name = "Float32Array";
template <> const char* const
TEANameTrait<v8::kExternalDoubleArray>::name = "Float64Array";
template <unsigned int TBytes, v8::ExternalArrayType TEAType> template <unsigned int TBytes, v8::ExternalArrayType TEAType>
class TypedArray { class TypedArray {
public: public:
@ -183,7 +207,7 @@ class TypedArray {
v8::HandleScope scope; v8::HandleScope scope;
ft_cache = v8::Persistent<v8::FunctionTemplate>::New( ft_cache = v8::Persistent<v8::FunctionTemplate>::New(
v8::FunctionTemplate::New(&TypedArray<TBytes, TEAType>::V8New)); v8::FunctionTemplate::New(&TypedArray<TBytes, TEAType>::V8New));
ft_cache->SetClassName(v8::String::New(TypeName())); ft_cache->SetClassName(v8::String::New(TEANameTrait<TEAType>::name));
v8::Local<v8::ObjectTemplate> instance = ft_cache->InstanceTemplate(); v8::Local<v8::ObjectTemplate> instance = ft_cache->InstanceTemplate();
instance->SetInternalFieldCount(0); instance->SetInternalFieldCount(0);
@ -441,23 +465,6 @@ class TypedArray {
return TypedArray<TBytes, TEAType>::GetTemplate()-> return TypedArray<TBytes, TEAType>::GetTemplate()->
GetFunction()->NewInstance(3, argv); GetFunction()->NewInstance(3, argv);
} }
static const char* TypeName() {
switch (TEAType) {
case v8::kExternalByteArray: return "Int8Array";
case v8::kExternalUnsignedByteArray: return "Uint8Array";
case v8::kExternalShortArray: return "Int16Array";
case v8::kExternalUnsignedShortArray: return "Uint16Array";
case v8::kExternalIntArray: return "Int32Array";
case v8::kExternalUnsignedIntArray: return "Uint32Array";
case v8::kExternalFloatArray: return "Float32Array";
case v8::kExternalDoubleArray: return "Float64Array";
case v8::kExternalPixelArray: return "Uint8ClampedArray";
}
abort();
// Please the compiler
return "";
}
}; };
class Int8Array : public TypedArray<1, v8::kExternalByteArray> { }; class Int8Array : public TypedArray<1, v8::kExternalByteArray> { };

Loading…
Cancel
Save