text: // Copyright 2011 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 MINI_CHROMIUM_BASE_MAC_SCOPED_LAUNCH_DATA_H_
  #define MINI_CHROMIUM_BASE_MAC_SCOPED_LAUNCH_DATA_H_
  
  #include <launch.h>
  
  #include <algorithm>
  
  #include "base/basictypes.h"
  #include "base/compiler_specific.h"
  
  namespace {
  
  inline void LaunchDataFree(launch_data_t data) {
  #pragma clang diagnostic push
  #pragma clang diagnostic ignored "-Wdeprecated-declarations"
    return launch_data_free(data);
  #pragma clang diagnostic pop
  }
  
  }  // namespace
  
  namespace base {
  namespace mac {
  
  // Just like scoped_ptr<> but for launch_data_t.
  class ScopedLaunchData {
   public:
    typedef launch_data_t element_type;
  
    explicit ScopedLaunchData(launch_data_t object = NULL)
        : object_(object) {
    }
  
    ~ScopedLaunchData() {
      if (object_)
        LaunchDataFree(object_);
    }
  
    void reset(launch_data_t object = NULL) {
      if (object != object_) {
        if (object_)
          LaunchDataFree(object_);
        object_ = object;
      }
    }
  
    bool operator==(launch_data_t that) const {
      return object_ == that;
    }
  
    bool operator!=(launch_data_t that) const {
      return object_ != that;
    }
  
    operator launch_data_t() const {
      return object_;
    }
  
    launch_data_t get() const {
      return object_;
    }
  
    void swap(ScopedLaunchData& that) {
      std::swap(object_, that.object_);
    }
  
    launch_data_t release() WARN_UNUSED_RESULT {
      launch_data_t temp = object_;
      object_ = NULL;
      return temp;
    }
  
   private:
    launch_data_t object_;
  
    DISALLOW_COPY_AND_ASSIGN(ScopedLaunchData);
  };
  
  }  // namespace mac
  }  // namespace base
  
  #endif  // MINI_CHROMIUM_BASE_MAC_SCOPED_LAUNCH_DATA_H_
  