1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef LIB_TONIC_TYPED_DATA_TYPED_LIST_H_
6#define LIB_TONIC_TYPED_DATA_TYPED_LIST_H_
7
8#include "third_party/dart/runtime/include/dart_api.h"
9#include "tonic/converter/dart_converter.h"
10
11namespace tonic {
12
13// A simple wrapper around Dart TypedData objects. It uses
14// Dart_TypedDataAcquireData to obtain a raw pointer to the data, which is
15// released when this object is destroyed.
16//
17// This is designed to be used with DartConverter only.
18template <Dart_TypedData_Type kTypeName, typename ElemType>
19class TypedList {
20 public:
21 explicit TypedList(Dart_Handle list);
22 TypedList(TypedList<kTypeName, ElemType>&& other);
23 TypedList();
24 ~TypedList();
25
26 ElemType& at(intptr_t i) {
27 TONIC_CHECK(0 <= i);
28 TONIC_CHECK(i < num_elements_);
29 return data_[i];
30 }
31 const ElemType& at(intptr_t i) const {
32 TONIC_CHECK(0 <= i);
33 TONIC_CHECK(i < num_elements_);
34 return data_[i];
35 }
36
37 ElemType& operator[](intptr_t i) { return at(i); }
38 const ElemType& operator[](intptr_t i) const { return at(i); }
39
40 const ElemType* data() const { return data_; }
41 intptr_t num_elements() const { return num_elements_; }
42 Dart_Handle dart_handle() const { return dart_handle_; }
43
44 void Release();
45
46 private:
47 ElemType* data_;
48 intptr_t num_elements_;
49 Dart_Handle dart_handle_;
50};
51
52template <Dart_TypedData_Type kTypeName, typename ElemType>
53struct DartConverter<TypedList<kTypeName, ElemType>> {
54 static void SetReturnValue(Dart_NativeArguments args,
55 TypedList<kTypeName, ElemType> val);
56 static TypedList<kTypeName, ElemType> FromArguments(Dart_NativeArguments args,
57 int index,
58 Dart_Handle& exception);
59 static Dart_Handle ToDart(const ElemType* buffer, unsigned int length);
60};
61
62#define TONIC_TYPED_DATA_FOREACH(F) \
63 F(Int8, int8_t) \
64 F(Uint8, uint8_t) \
65 F(Int16, int16_t) \
66 F(Uint16, uint16_t) \
67 F(Int32, int32_t) \
68 F(Uint32, uint32_t) \
69 F(Int64, int64_t) \
70 F(Uint64, uint64_t) \
71 F(Float32, float) \
72 F(Float64, double)
73
74#define TONIC_TYPED_DATA_DECLARE(name, type) \
75 using name##List = TypedList<Dart_TypedData_k##name, type>; \
76 extern template class TypedList<Dart_TypedData_k##name, type>; \
77 extern template struct DartConverter<name##List>;
78
79TONIC_TYPED_DATA_FOREACH(TONIC_TYPED_DATA_DECLARE)
80
81#undef TONIC_TYPED_DATA_DECLARE
82
83} // namespace tonic
84
85#endif // LIB_TONIC_TYPED_DATA_TYPED_LIST_H_
86