summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDean McNamee <dean@gmail.com>2012-12-18 20:03:41 +0100
committerBen Noordhuis <info@bnoordhuis.nl>2013-01-08 05:08:00 +0100
commitb50d51ef5b5ebdf250eefc387ed25c7aaae557f4 (patch)
treed93843b6e8ae7bcb73ed22e9bcb022323135fc01
parent9b363b022f2de766e05f106c2c92eaf4f46fbcf8 (diff)
downloadnode-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.cc43
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> { };