|  | // Copyright 2013 The Flutter 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 FLUTTER_FML_UNIQUE_FD_H_ | 
|  | #define FLUTTER_FML_UNIQUE_FD_H_ | 
|  |  | 
|  | #include "flutter/fml/build_config.h" | 
|  | #include "flutter/fml/unique_object.h" | 
|  |  | 
|  | #if OS_WIN | 
|  | #include <windows.h> | 
|  | #else  // OS_WIN | 
|  | #include <dirent.h> | 
|  | #include <unistd.h> | 
|  | #endif  // OS_WIN | 
|  |  | 
|  | namespace fml { | 
|  | namespace internal { | 
|  |  | 
|  | #if OS_WIN | 
|  |  | 
|  | namespace os_win { | 
|  |  | 
|  | struct UniqueFDTraits { | 
|  | static HANDLE InvalidValue() { return INVALID_HANDLE_VALUE; } | 
|  | static bool IsValid(HANDLE value) { return value != InvalidValue(); } | 
|  | static void Free(HANDLE fd); | 
|  | }; | 
|  |  | 
|  | }  // namespace os_win | 
|  |  | 
|  | #else  // OS_WIN | 
|  |  | 
|  | namespace os_unix { | 
|  |  | 
|  | struct UniqueFDTraits { | 
|  | static int InvalidValue() { return -1; } | 
|  | static bool IsValid(int value) { return value >= 0; } | 
|  | static void Free(int fd); | 
|  | }; | 
|  |  | 
|  | struct UniqueDirTraits { | 
|  | static DIR* InvalidValue() { return nullptr; } | 
|  | static bool IsValid(DIR* value) { return value != nullptr; } | 
|  | static void Free(DIR* dir); | 
|  | }; | 
|  |  | 
|  | }  // namespace os_unix | 
|  |  | 
|  | #endif  // OS_WIN | 
|  |  | 
|  | }  // namespace internal | 
|  |  | 
|  | #if OS_WIN | 
|  |  | 
|  | using UniqueFD = UniqueObject<HANDLE, internal::os_win::UniqueFDTraits>; | 
|  |  | 
|  | #else  // OS_WIN | 
|  |  | 
|  | using UniqueFD = UniqueObject<int, internal::os_unix::UniqueFDTraits>; | 
|  | using UniqueDir = UniqueObject<DIR*, internal::os_unix::UniqueDirTraits>; | 
|  |  | 
|  | #endif  // OS_WIN | 
|  |  | 
|  | }  // namespace fml | 
|  |  | 
|  | #endif  // FLUTTER_FML_UNIQUE_FD_H_ |