Start using allowed C++11 features.

R=dml@google.com, thakis@chromium.org

Review URL: https://codereview.chromium.org/1544923002 .
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
index d5a2780..2a271f1 100644
--- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
@@ -327,7 +327,7 @@
     if (!pSecurityHandler->OnInit(this, m_pEncryptDict)) {
       return err;
     }
-    m_pSecurityHandler = nonstd::move(pSecurityHandler);
+    m_pSecurityHandler = std::move(pSecurityHandler);
     nonstd::unique_ptr<CPDF_CryptoHandler> pCryptoHandler(
         m_pSecurityHandler->CreateCryptoHandler());
     if (!pCryptoHandler->Init(m_pEncryptDict, m_pSecurityHandler.get())) {
@@ -456,8 +456,7 @@
   FX_FILESIZE SavedPos = m_Syntax.SavePos();
   const int32_t recordsize = 20;
   std::vector<char> buf(1024 * recordsize + 1);
-  char* pBuf = pdfium::vector_as_array(&buf);
-  pBuf[1024 * recordsize] = '\0';
+  buf[1024 * recordsize] = '\0';
   int32_t nBlocks = count / 1024 + 1;
   for (int32_t block = 0; block < nBlocks; block++) {
     int32_t block_size = block == nBlocks - 1 ? count % 1024 : 1024;
@@ -465,12 +464,13 @@
     if ((FX_FILESIZE)(dwStartPos + dwReadSize) > m_Syntax.m_FileLen) {
       return FALSE;
     }
-    if (!m_Syntax.ReadBlock(reinterpret_cast<uint8_t*>(pBuf), dwReadSize)) {
+    if (!m_Syntax.ReadBlock(reinterpret_cast<uint8_t*>(buf.data()),
+                            dwReadSize)) {
       return FALSE;
     }
     for (int32_t i = 0; i < block_size; i++) {
       FX_DWORD objnum = start_objnum + block * 1024 + i;
-      char* pEntry = pBuf + i * recordsize;
+      char* pEntry = &buf[i * recordsize];
       if (pEntry[17] == 'f') {
         m_ObjectInfo[objnum].pos = 0;
         m_V5Type.SetAtGrow(objnum, 0);
@@ -544,16 +544,15 @@
     m_dwXrefStartObjNum = start_objnum;
     if (!bSkip) {
       std::vector<char> buf(1024 * recordsize + 1);
-      char* pBuf = pdfium::vector_as_array(&buf);
-      pBuf[1024 * recordsize] = '\0';
+      buf[1024 * recordsize] = '\0';
       int32_t nBlocks = count / 1024 + 1;
       for (int32_t block = 0; block < nBlocks; block++) {
         int32_t block_size = block == nBlocks - 1 ? count % 1024 : 1024;
-        m_Syntax.ReadBlock(reinterpret_cast<uint8_t*>(pBuf),
+        m_Syntax.ReadBlock(reinterpret_cast<uint8_t*>(buf.data()),
                            block_size * recordsize);
         for (int32_t i = 0; i < block_size; i++) {
           FX_DWORD objnum = start_objnum + block * 1024 + i;
-          char* pEntry = pBuf + i * recordsize;
+          char* pEntry = &buf[i * recordsize];
           if (pEntry[17] == 'f') {
             m_ObjectInfo[objnum].pos = 0;
             m_V5Type.SetAtGrow(objnum, 0);
@@ -3606,7 +3605,7 @@
       ParseIndirectObjectAt(szHSStart, 0));
   CPDF_Stream* pStream = ToStream(pHintStream.get());
   if (pStream && pHintTables->LoadHintStream(pStream))
-    m_pHintTables = nonstd::move(pHintTables);
+    m_pHintTables = std::move(pHintTables);
 
   m_docStatus = PDF_DATAAVAIL_DONE;
   return TRUE;
diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render_image.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render_image.cpp
index ea6195d..0afd8f0 100644
--- a/core/src/fpdfapi/fpdf_render/fpdf_render_image.cpp
+++ b/core/src/fpdfapi/fpdf_render/fpdf_render_image.cpp
@@ -6,6 +6,8 @@
 
 #include "render_int.h"
 
+#include <utility>
+
 #include "core/include/fpdfapi/fpdf_module.h"
 #include "core/include/fpdfapi/fpdf_pageobj.h"
 #include "core/include/fpdfapi/fpdf_render.h"
@@ -126,7 +128,7 @@
   pBackdrop1->Clear((FX_DWORD)-1);
   pBackdrop1->CompositeBitmap(0, 0, pBackdrop->GetWidth(),
                               pBackdrop->GetHeight(), pBackdrop.get(), 0, 0);
-  pBackdrop = nonstd::move(pBackdrop1);
+  pBackdrop = std::move(pBackdrop1);
   m_pDevice->SetDIBits(pBackdrop.get(), back_left, back_top);
 }
 
diff --git a/core/src/fxcodec/codec/fx_codec.cpp b/core/src/fxcodec/codec/fx_codec.cpp
index 6998114..b7b5563 100644
--- a/core/src/fxcodec/codec/fx_codec.cpp
+++ b/core/src/fxcodec/codec/fx_codec.cpp
@@ -1,4 +1,3 @@
-
 // Copyright 2014 PDFium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
@@ -8,6 +7,7 @@
 #include "core/include/fxcodec/fx_codec.h"
 
 #include <cmath>
+#include <utility>
 
 #include "codec_int.h"
 #include "core/include/fxcrt/fx_ext.h"
@@ -139,7 +139,7 @@
   if (!cache->AllocateCache())
     return;
 
-  m_pDataCache = nonstd::move(cache);
+  m_pDataCache = std::move(cache);
 }
 
 FX_BOOL CCodec_BasicModule::RunLengthEncode(const uint8_t* src_buf,
diff --git a/core/src/fxcodec/jbig2/JBig2_Context.cpp b/core/src/fxcodec/jbig2/JBig2_Context.cpp
index 2a28185..9503fed 100644
--- a/core/src/fxcodec/jbig2/JBig2_Context.cpp
+++ b/core/src/fxcodec/jbig2/JBig2_Context.cpp
@@ -8,6 +8,7 @@
 
 #include <algorithm>
 #include <list>
+#include <utility>
 #include <vector>
 
 #include "core/src/fxcodec/jbig2/JBig2_ArithDecoder.h"
@@ -1119,7 +1120,7 @@
       }
     }
     pGRD->USESKIP = 0;
-    m_pGRD = nonstd::move(pGRD);
+    m_pGRD = std::move(pGRD);
   }
   pSegment->m_nResultType = JBIG2_IMAGE_POINTER;
   if (m_pGRD->MMR == 0) {
diff --git a/core/src/fxcodec/jbig2/JBig2_SddProc.cpp b/core/src/fxcodec/jbig2/JBig2_SddProc.cpp
index 06d6520..e9ce932 100644
--- a/core/src/fxcodec/jbig2/JBig2_SddProc.cpp
+++ b/core/src/fxcodec/jbig2/JBig2_SddProc.cpp
@@ -18,9 +18,6 @@
 #include "core/src/fxcodec/jbig2/JBig2_SymbolDict.h"
 #include "core/src/fxcodec/jbig2/JBig2_TrdProc.h"
 #include "third_party/base/nonstd_unique_ptr.h"
-#include "third_party/base/stl_util.h"
-
-using pdfium::vector_as_array;
 
 CJBig2_SymbolDict* CJBig2_SDDProc::decode_Arith(
     CJBig2_ArithDecoder* pArithDecoder,
@@ -110,7 +107,7 @@
         pGRD->GBAT[5] = SDAT[5];
         pGRD->GBAT[6] = SDAT[6];
         pGRD->GBAT[7] = SDAT[7];
-        BS = pGRD->decode_Arith(pArithDecoder, vector_as_array(gbContext));
+        BS = pGRD->decode_Arith(pArithDecoder, gbContext->data());
         if (!BS) {
           goto failed;
         }
@@ -198,8 +195,7 @@
           ids.IARDX = IARDX.get();
           ids.IARDY = IARDY.get();
           ids.IAID = IAID.get();
-          BS = pDecoder->decode_Arith(pArithDecoder, vector_as_array(grContext),
-                                      &ids);
+          BS = pDecoder->decode_Arith(pArithDecoder, grContext->data(), &ids);
           if (!BS) {
             FX_Free(SBSYMS);
             goto failed;
@@ -234,7 +230,7 @@
           pGRRD->GRAT[1] = SDRAT[1];
           pGRRD->GRAT[2] = SDRAT[2];
           pGRRD->GRAT[3] = SDRAT[3];
-          BS = pGRRD->decode(pArithDecoder, vector_as_array(grContext));
+          BS = pGRRD->decode(pArithDecoder, grContext->data());
           if (!BS) {
             FX_Free(SBSYMS);
             goto failed;
@@ -448,7 +444,7 @@
           pDecoder->SBRAT[1] = SDRAT[1];
           pDecoder->SBRAT[2] = SDRAT[2];
           pDecoder->SBRAT[3] = SDRAT[3];
-          BS = pDecoder->decode_Huffman(pStream, vector_as_array(grContext));
+          BS = pDecoder->decode_Huffman(pStream, grContext->data());
           if (!BS) {
             FX_Free(SBSYMCODES);
             FX_Free(SBSYMS);
@@ -520,7 +516,7 @@
           pGRRD->GRAT[3] = SDRAT[3];
           nonstd::unique_ptr<CJBig2_ArithDecoder> pArithDecoder(
               new CJBig2_ArithDecoder(pStream));
-          BS = pGRRD->decode(pArithDecoder.get(), vector_as_array(grContext));
+          BS = pGRRD->decode(pArithDecoder.get(), grContext->data());
           if (!BS) {
             FX_Free(SBSYMS);
             goto failed;
diff --git a/core/src/fxge/ge/fx_ge_fontmap.cpp b/core/src/fxge/ge/fx_ge_fontmap.cpp
index 1101da2..dadcf1c 100644
--- a/core/src/fxge/ge/fx_ge_fontmap.cpp
+++ b/core/src/fxge/ge/fx_ge_fontmap.cpp
@@ -711,7 +711,7 @@
     return CFX_ByteString();
 
   std::vector<uint8_t> buffer(size);
-  uint8_t* buffer_ptr = pdfium::vector_as_array(&buffer);
+  uint8_t* buffer_ptr = buffer.data();
   FX_DWORD bytes_read =
       m_pFontInfo->GetFontData(hFont, kTableNAME, buffer_ptr, size);
   return (bytes_read == size) ? GetNameFromTT(buffer_ptr, 6) : CFX_ByteString();
diff --git a/samples/image_diff.cc b/samples/image_diff.cc
index 88a3956..d246529 100644
--- a/samples/image_diff.cc
+++ b/samples/image_diff.cc
@@ -80,8 +80,8 @@
 
     fclose(f);
 
-    if (!image_diff_png::DecodePNG(&compressed[0], compressed.size(),
-                                   &data_, &w_, &h_)) {
+    if (!image_diff_png::DecodePNG(compressed.data(), compressed.size(), &data_,
+                                   &w_, &h_)) {
       Clear();
       return false;
     }
diff --git a/third_party/base/nonstd_unique_ptr.h b/third_party/base/nonstd_unique_ptr.h
index f519b34..f056e50 100644
--- a/third_party/base/nonstd_unique_ptr.h
+++ b/third_party/base/nonstd_unique_ptr.h
@@ -74,18 +74,12 @@
 #include <stdlib.h>
 
 #include <ostream>
+#include <utility>
 
 #include "template_util.h"
 
 namespace nonstd {
 
-// Replacement for move, but doesn't allow things that are already
-// rvalue references.
-template <class T>
-T&& move(T& t) {
-  return static_cast<T&&>(t);
-}
-
 // Function object which deletes its parameter, which must be a pointer.
 // If C is an array type, invokes 'delete[]' on the parameter; otherwise,
 // invokes 'delete'. The default deleter for unique_ptr<T>.
@@ -244,7 +238,7 @@
 
   // Move constructor.
   unique_ptr(unique_ptr&& that)
-      : internal::unique_ptr_base<C, D>(nonstd::move(that)) {}
+      : internal::unique_ptr_base<C, D>(std::move(that)) {}
 
   // operator=.  Allows assignment from a nullptr. Deletes the currently owned
   // object, if any.
@@ -317,7 +311,7 @@
 
   // Move constructor.
   unique_ptr(unique_ptr&& that)
-      : internal::unique_ptr_base<C, D>(nonstd::move(that)) {}
+      : internal::unique_ptr_base<C, D>(std::move(that)) {}
 
   // operator=.  Allows assignment from a nullptr. Deletes the currently owned
   // array, if any.
diff --git a/third_party/base/nonstd_unique_ptr_unittest.cpp b/third_party/base/nonstd_unique_ptr_unittest.cpp
index 2b12058..1dcfe48 100644
--- a/third_party/base/nonstd_unique_ptr_unittest.cpp
+++ b/third_party/base/nonstd_unique_ptr_unittest.cpp
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include <sstream>
+#include <utility>
 
 #include "testing/gtest/include/gtest/gtest.h"
 #include "macros.h"
@@ -65,20 +66,20 @@
     EXPECT_EQ(1, constructed);
     EXPECT_TRUE(ptr1);
 
-    unique_ptr<CtorDtorLogger> ptr2(nonstd::move(ptr1));
+    unique_ptr<CtorDtorLogger> ptr2(std::move(ptr1));
     EXPECT_EQ(1, constructed);
     EXPECT_FALSE(ptr1);
     EXPECT_TRUE(ptr2);
 
     unique_ptr<CtorDtorLogger> ptr3;
-    ptr3 = nonstd::move(ptr2);
+    ptr3 = std::move(ptr2);
     EXPECT_EQ(1, constructed);
     EXPECT_FALSE(ptr2);
     EXPECT_TRUE(ptr3);
 
     unique_ptr<CtorDtorLogger> ptr4(new CtorDtorLogger(&constructed4));
     EXPECT_EQ(1, constructed4);
-    ptr4 = nonstd::move(ptr3);
+    ptr4 = std::move(ptr3);
     EXPECT_EQ(0, constructed4);
     EXPECT_FALSE(ptr3);
     EXPECT_TRUE(ptr4);
diff --git a/third_party/base/stl_util.h b/third_party/base/stl_util.h
index 50e9341..3265603 100644
--- a/third_party/base/stl_util.h
+++ b/third_party/base/stl_util.h
@@ -5,23 +5,8 @@
 #ifndef PDFIUM_THIRD_PARTY_BASE_STL_UTIL_H_
 #define PDFIUM_THIRD_PARTY_BASE_STL_UTIL_H_
 
-#include <vector>
-
 namespace pdfium {
 
-// To treat a possibly-empty vector as an array, use these functions.
-// If you know the array will never be empty, you can use &*v.begin()
-// directly, but that is undefined behaviour if |v| is empty.
-template <typename T>
-inline T* vector_as_array(std::vector<T>* v) {
-  return v->empty() ? nullptr : &*v->begin();
-}
-
-template <typename T>
-inline const T* vector_as_array(const std::vector<T>* v) {
-  return v->empty() ? nullptr : &*v->begin();
-}
-
 // Test to see if a set, map, hash_set or hash_map contains a particular key.
 // Returns true if the key is in the collection.
 template <typename Collection, typename Key>