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