// Copyright (c) 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef GPU_COMMAND_BUFFER_SERVICE_PATH_MANAGER_H_
#define GPU_COMMAND_BUFFER_SERVICE_PATH_MANAGER_H_

#include <map>

#include "base/macros.h"
#include "gpu/command_buffer/service/gl_utils.h"
#include "gpu/gpu_gles2_export.h"

namespace gpu {
namespace gles2 {

// This class keeps track of paths and their client and service ids
// so we can correctly clear them.
class GPU_GLES2_EXPORT PathManager {
 public:
  PathManager();
  ~PathManager();

  // Must call before destruction.
  void Destroy(bool have_context);

  // Creates a path mapping between closed intervals
  // [first_client_id, last_client_id] -> [first_service_id, ...].
  void CreatePathRange(GLuint first_client_id,
                       GLuint last_client_id,
                       GLuint first_service_id);

  // Returns true if any path exists in the closed interval
  // [first_client_id, last_client_id].
  bool HasPathsInRange(GLuint first_client_id, GLuint last_client_id) const;

  // Gets the path id corresponding the client path id.
  // Returns false if no such service path id was not found.
  bool GetPath(GLuint client_id, GLuint* service_id) const;

  // Removes a closed interval of paths [first_client_id, last_client_id].
  void RemovePaths(GLuint first_client_id, GLuint last_client_id);

  // Mapping between client id and service id.
  // Should be used only by the implementation.
  struct PathRangeDescription {
    PathRangeDescription(GLuint last_client, GLuint first_service)
        : last_client_id(last_client), first_service_id(first_service) {}
    GLuint last_client_id;
    GLuint first_service_id;
    typedef GLuint ServiceIdType;
  };
  typedef std::map<GLuint, PathRangeDescription> PathRangeMap;

 private:
  // Checks for consistency inside the book-keeping structures. Used as
  // DCHECK pre/post condition in mutating functions.
  bool CheckConsistency();

  PathRangeMap path_map_;

  DISALLOW_COPY_AND_ASSIGN(PathManager);
};

}  // namespace gles2
}  // namespace gpu

#endif  // GPU_COMMAND_BUFFER_SERVICE_PATH_MANAGER_H_
