17ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski/* 27ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski * Copyright (C) 2016 The Android Open Source Project 37ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski * 47ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 57ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski * you may not use this file except in compliance with the License. 67ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski * You may obtain a copy of the License at 77ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski * 87ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 97ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski * 107ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski * Unless required by applicable law or agreed to in writing, software 117ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 127ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski * See the License for the specific language governing permissions and 147ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski * limitations under the License. 157ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski */ 167ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 177ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski#ifndef UTIL_H_ 187ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski#define UTIL_H_ 197ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 207ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski#include <cstdlib> 217ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski#include <memory> 227ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 237ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski#include "android-base/macros.h" 247ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 25d1ecd7af687bcad0f87c37fe33515ff6c5ea0f1dAdam Lesinski#include "androidfw/StringPiece.h" 26d1ecd7af687bcad0f87c37fe33515ff6c5ea0f1dAdam Lesinski 277ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinskinamespace android { 287ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinskinamespace util { 297ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 307ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski/** 317ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski * Makes a std::unique_ptr<> with the template parameter inferred by the 327ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski * compiler. 337ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski * This will be present in C++14 and can be removed then. 347ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski */ 357ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinskitemplate <typename T, class... Args> 367ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinskistd::unique_ptr<T> make_unique(Args&&... args) { 377ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski return std::unique_ptr<T>(new T{std::forward<Args>(args)...}); 387ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski} 397ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 407ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski// Based on std::unique_ptr, but uses free() to release malloc'ed memory 417ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski// without incurring the size increase of holding on to a custom deleter. 427ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinskitemplate <typename T> 437ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinskiclass unique_cptr { 447ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski public: 457ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski using pointer = typename std::add_pointer<T>::type; 467ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 477ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski constexpr unique_cptr() : ptr_(nullptr) {} 487ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski constexpr unique_cptr(std::nullptr_t) : ptr_(nullptr) {} 497ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski explicit unique_cptr(pointer ptr) : ptr_(ptr) {} 507ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski unique_cptr(unique_cptr&& o) : ptr_(o.ptr_) { o.ptr_ = nullptr; } 517ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 527ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski ~unique_cptr() { std::free(reinterpret_cast<void*>(ptr_)); } 537ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 547ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski inline unique_cptr& operator=(unique_cptr&& o) { 557ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski if (&o == this) { 567ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski return *this; 577ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski } 587ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 597ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski std::free(reinterpret_cast<void*>(ptr_)); 607ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski ptr_ = o.ptr_; 617ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski o.ptr_ = nullptr; 627ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski return *this; 637ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski } 647ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 657ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski inline unique_cptr& operator=(std::nullptr_t) { 667ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski std::free(reinterpret_cast<void*>(ptr_)); 677ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski ptr_ = nullptr; 687ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski return *this; 697ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski } 707ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 717ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski pointer release() { 727ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski pointer result = ptr_; 737ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski ptr_ = nullptr; 747ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski return result; 757ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski } 767ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 777ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski inline pointer get() const { return ptr_; } 787ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 797ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski void reset(pointer ptr = pointer()) { 807ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski if (ptr == ptr_) { 817ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski return; 827ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski } 837ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 847ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski pointer old_ptr = ptr_; 857ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski ptr_ = ptr; 867ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski std::free(reinterpret_cast<void*>(old_ptr)); 877ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski } 887ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 897ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski inline void swap(unique_cptr& o) { std::swap(ptr_, o.ptr_); } 907ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 917ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski inline explicit operator bool() const { return ptr_ != nullptr; } 927ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 937ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski inline typename std::add_lvalue_reference<T>::type operator*() const { return *ptr_; } 947ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 957ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski inline pointer operator->() const { return ptr_; } 967ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 977ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski inline bool operator==(const unique_cptr& o) const { return ptr_ == o.ptr_; } 987ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 990c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski inline bool operator!=(const unique_cptr& o) const { return ptr_ != o.ptr_; } 1000c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski 1017ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski inline bool operator==(std::nullptr_t) const { return ptr_ == nullptr; } 1027ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 1030c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski inline bool operator!=(std::nullptr_t) const { return ptr_ != nullptr; } 1040c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski 1057ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski private: 1067ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski DISALLOW_COPY_AND_ASSIGN(unique_cptr); 1077ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 1087ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski pointer ptr_; 1097ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski}; 1107ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 111da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinskivoid ReadUtf16StringFromDevice(const uint16_t* src, size_t len, std::string* out); 112da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski 113d1ecd7af687bcad0f87c37fe33515ff6c5ea0f1dAdam Lesinski// Converts a UTF-8 string to a UTF-16 string. 114d1ecd7af687bcad0f87c37fe33515ff6c5ea0f1dAdam Lesinskistd::u16string Utf8ToUtf16(const StringPiece& utf8); 115d1ecd7af687bcad0f87c37fe33515ff6c5ea0f1dAdam Lesinski 116d1ecd7af687bcad0f87c37fe33515ff6c5ea0f1dAdam Lesinski// Converts a UTF-16 string to a UTF-8 string. 117d1ecd7af687bcad0f87c37fe33515ff6c5ea0f1dAdam Lesinskistd::string Utf16ToUtf8(const StringPiece16& utf16); 118d1ecd7af687bcad0f87c37fe33515ff6c5ea0f1dAdam Lesinski 1197ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski} // namespace util 1207ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski} // namespace android 1217ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 1227ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski#endif /* UTIL_H_ */ 123