// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

#ifndef BIN_RESOURCES_H_
#define BIN_RESOURCES_H_

#include <stddef.h>
#include <string.h>

#include "platform/assert.h"


class Resources {
 public:
  static const int kNoSuchInstance = -1;

  static int ResourceLookup(const char* path, const char** resource) {
    for (int i = 0; i < get_resource_count(); i++) {
      resource_map_entry* entry = get_resource(i);
      if (strcmp(path, entry->path_) == 0) {
        *resource = entry->resource_;
        ASSERT(entry->length_ > 0);
        return entry->length_;
      }
    }
    return kNoSuchInstance;
  }

 private:
  struct resource_map_entry {
    const char* path_;
    const char* resource_;
    intptr_t length_;
  };

  // These fields are generated by resources_gen.cc.
  static resource_map_entry builtin_resources_[];
  static const intptr_t builtin_resources_count_;

  static resource_map_entry* get_resource(int i) {
    ASSERT(i >= 0 && i < builtin_resources_count_);
    return &builtin_resources_[i];
  }

  static intptr_t get_resource_count() {
    return builtin_resources_count_; }

  DISALLOW_ALLOCATION();
  DISALLOW_IMPLICIT_CONSTRUCTORS(Resources);
};

#endif  // BIN_RESOURCES_H_
