1 // Copyright 2017 The Chromium 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 #include "third_party/blink/renderer/modules/webaudio/audio_param_map.h"
6 
7 namespace blink {
8 
9 class AudioParamMapIterationSource final
10     : public PairIterable<String, AudioParam*>::IterationSource {
11  public:
AudioParamMapIterationSource(const HeapHashMap<String,Member<AudioParam>> & map)12   AudioParamMapIterationSource(
13       const HeapHashMap<String, Member<AudioParam>>& map) {
14     for (const auto& name : map.Keys()) {
15       parameter_names_.push_back(name);
16       parameter_objects_.push_back(map.at(name));
17     }
18   }
19 
Next(ScriptState * scrip_state,String & key,AudioParam * & audio_param,ExceptionState &)20   bool Next(ScriptState* scrip_state,
21             String& key,
22             AudioParam*& audio_param,
23             ExceptionState&) override {
24     if (current_index_ == parameter_names_.size())
25       return false;
26     key = parameter_names_[current_index_];
27     audio_param = parameter_objects_[current_index_];
28     ++current_index_;
29     return true;
30   }
31 
Trace(Visitor * visitor) const32   void Trace(Visitor* visitor) const override {
33     visitor->Trace(parameter_objects_);
34     PairIterable<String, AudioParam*>::IterationSource::Trace(visitor);
35   }
36 
37  private:
38   // For sequential iteration (e.g. Next()).
39   Vector<String> parameter_names_;
40   HeapVector<Member<AudioParam>> parameter_objects_;
41   unsigned current_index_;
42 };
43 
AudioParamMap(const HeapHashMap<String,Member<AudioParam>> & parameter_map)44 AudioParamMap::AudioParamMap(
45     const HeapHashMap<String, Member<AudioParam>>& parameter_map)
46     : parameter_map_(parameter_map) {}
47 
48 PairIterable<String, AudioParam*>::IterationSource*
StartIteration(ScriptState *,ExceptionState &)49     AudioParamMap::StartIteration(ScriptState*, ExceptionState&) {
50   return MakeGarbageCollected<AudioParamMapIterationSource>(parameter_map_);
51 }
52 
GetMapEntry(ScriptState *,const String & key,AudioParam * & audio_param,ExceptionState &)53 bool AudioParamMap::GetMapEntry(ScriptState*,
54                                 const String& key,
55                                 AudioParam*& audio_param,
56                                 ExceptionState&) {
57   if (parameter_map_.Contains(key)) {
58     audio_param = parameter_map_.at(key);
59     return true;
60   }
61 
62   return false;
63 }
64 
65 }  // namespace blink
66