/*
 * Copyright 2015 Google Inc. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef COBALT_RENDER_TREE_MOVABLE_H_
#define COBALT_RENDER_TREE_MOVABLE_H_

// Defines a helper structure and Pass() method that can be used to express
// that we are passing the structure with move semantics and not copy semantics.
// This would be trivial in C++11.  It should be passed directly into a
// constructor or object that will consume a moved object.
// It is different than what is found within base/move.h because this does
// not restrict one from also copying the object, and it also makes no attempt
// to automatically detect when the host object is being used as an rvalue,
// it must always be made explicit by calling Pass().
#define DECLARE_AS_MOVABLE(x)                      \
  class Moved {                                    \
   public:                                         \
    explicit Moved(x* object) : object_(object) {} \
    x* operator*() { return object_; }             \
    x* operator->() { return object_; }            \
                                                   \
   private:                                        \
    x* object_;                                    \
  };                                               \
                                                   \
  Moved Pass() { return Moved(this); }

#endif  // COBALT_RENDER_TREE_MOVABLE_H_
