// 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"


namespace dart {
namespace bin {

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);
};

}  // namespace bin
}  // namespace dart

#endif  // BIN_RESOURCES_H_
