diff options
author | Dean McNamee <dean@gmail.com> | 2012-12-18 20:03:41 +0100 |
---|---|---|
committer | Ben Noordhuis <info@bnoordhuis.nl> | 2013-01-08 05:08:00 +0100 |
commit | b50d51ef5b5ebdf250eefc387ed25c7aaae557f4 (patch) | |
tree | d93843b6e8ae7bcb73ed22e9bcb022323135fc01 | |
parent | 9b363b022f2de766e05f106c2c92eaf4f46fbcf8 (diff) | |
download | node-new-b50d51ef5b5ebdf250eefc387ed25c7aaae557f4.tar.gz |
typed arrays: replace switch with templates
Convert TypedArray's TypeName implementation to template specialization
instead of a switch() statement.
-rw-r--r-- | src/v8_typed_array.cc | 43 |
1 files changed, 25 insertions, 18 deletions
diff --git a/src/v8_typed_array.cc b/src/v8_typed_array.cc index 9b1aa442b7..a0a5e8b444 100644 --- a/src/v8_typed_array.cc +++ b/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. } +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> class TypedArray { public: @@ -183,7 +207,7 @@ class TypedArray { v8::HandleScope scope; ft_cache = v8::Persistent<v8::FunctionTemplate>::New( 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(); instance->SetInternalFieldCount(0); @@ -441,23 +465,6 @@ class TypedArray { return TypedArray<TBytes, TEAType>::GetTemplate()-> 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> { }; |