/*
 * Copyright 2017 The Cobalt Authors. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef COBALT_INPUT_INPUT_POLLER_IMPL_H_
#define COBALT_INPUT_INPUT_POLLER_IMPL_H_

#include <map>

#include "base/containers/hash_tables.h"
#include "base/containers/small_map.h"
#include "cobalt/input/input_poller.h"
#include "cobalt/system_window/input_event.h"
#include "starboard/common/mutex.h"
#include "starboard/input.h"
#include "starboard/window.h"

namespace cobalt {
namespace input {

class InputPollerImpl : public InputPoller {
 public:
  InputPollerImpl();
  virtual ~InputPollerImpl() {}

  bool IsPressed(SbKey keycode) override;
  // Returns analog position. The value is normalized to a range from
  // -1.0 to 1.0
  float AnalogInput(SbKey analog_input_id) override;
  void UpdateInputEvent(const system_window::InputEvent* input_event);

 private:
  typedef base::small_map<std::map<SbKey, float>, 8> KeyOffsetMap;

  starboard::Mutex input_mutex_;
  base::hash_set<int> pressed_keys_;
  KeyOffsetMap key_offset_map_;
};

}  // namespace input
}  // namespace cobalt

#endif  // COBALT_INPUT_INPUT_POLLER_IMPL_H_
