// Copyright (c) 2010 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 BASE_MOVE_H_ #define BASE_MOVE_H_ #pragma once #include namespace base { // The move function provides a functional form of swap to move a swappable // value leverage the compiler return value optimization and avoiding copy. // // The type being moved must have an efficient swap() and be default // contructable and copyable. // // C++0x will contain an std::move() function that makes use of rvalue // references to achieve the same result. When std::move() is available, it // can replace base::move(). // // For example, the following code will not produce any copies of the string. // // std::string f() { // std::string result("Hello World"); // return result; // } // // class Class { // public: // Class(std::string x) // Pass sink argument by value // : m_(move(x)); // Move x into m_ // private: // std::string m_; // }; // // int main() { // Class x(f()); // the result string of f() is allocated as the temp argument // // to x() and then swapped into the member m_. No Strings // // are copied by this call. // ... template // T models Regular T move(T& x) { // NOLINT : Non-const ref for standard library conformance using std::swap; T result; swap(x, result); return result; } } // namespace base #endif // BASE_MOVE_H_