// Copyright 2013 The Flutter 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 FLUTTER_RUNTIME_DART_VM_DATA_H_
#define FLUTTER_RUNTIME_DART_VM_DATA_H_

#include "flutter/fml/macros.h"
#include "flutter/runtime/dart_snapshot.h"

namespace flutter {

class DartVMData {
 public:
  static std::shared_ptr<const DartVMData> Create(
      Settings settings,
      fml::RefPtr<DartSnapshot> vm_snapshot,
      fml::RefPtr<DartSnapshot> isolate_snapshot,
      fml::RefPtr<DartSnapshot> shared_snapshot);

  ~DartVMData();

  const Settings& GetSettings() const;

  const DartSnapshot& GetVMSnapshot() const;

  fml::RefPtr<const DartSnapshot> GetIsolateSnapshot() const;

  fml::RefPtr<const DartSnapshot> GetSharedSnapshot() const;

 private:
  const Settings settings_;
  const fml::RefPtr<const DartSnapshot> vm_snapshot_;
  const fml::RefPtr<const DartSnapshot> isolate_snapshot_;
  const fml::RefPtr<const DartSnapshot> shared_snapshot_;

  DartVMData(Settings settings,
             fml::RefPtr<const DartSnapshot> vm_snapshot,
             fml::RefPtr<const DartSnapshot> isolate_snapshot,
             fml::RefPtr<const DartSnapshot> shared_snapshot);

  FML_DISALLOW_COPY_AND_ASSIGN(DartVMData);
};

}  // namespace flutter

#endif  // FLUTTER_RUNTIME_DART_VM_DATA_H_
