Loading...
lsl/ByteStream.h dyld-1340 /dev/null
--- dyld/dyld-1340/lsl/ByteStream.h
+++ /dev/null
@@ -1,161 +0,0 @@
-/* -*- mode: C++; c-basic-offset: 4; tab-width: 4 -*- vim: ft=cpp et ts=4 sw=4:
- *
- * Copyright (c) 2023 Apple Inc. All rights reserved.
- *
- * @APPLE_LICENSE_HEADER_START@
- *
- * This file contains Original Code and/or Modifications of Original Code
- * as defined in and that are subject to the Apple Public Source License
- * Version 2.0 (the 'License'). You may not use this file except in
- * compliance with the License. Please obtain a copy of the License at
- * http://www.opensource.apple.com/apsl/ and read it before using this
- * file.
- *
- * The Original Code and all software distributed under the License are
- * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
- * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
- * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
- * Please see the License for the specific language governing rights and
- * limitations under the License.
- *
- * @APPLE_LICENSE_HEADER_END@
- */
-
-// FIXME: Move to std::endian when libc++ implements it
-
-#ifndef ByteStream_h
-#define ByteStream_h
-
-#include <cstdint>
-#include <cstring>
-#include <string_view>
-//#include <libkern/OSByteOrder.h>
-
-#include "Vector.h"
-
-/* This provides a thin wrapper over Vector<std::byte>. The primary feature it includes is the ability to handle endian swaps.
- * This is useful when a stream contains both big and little endian data, for example, when AppleArchive (little endian) wraps
- * a binary plist (big endian). It is implemented by overloading push_back for all integer types (where swaps are handled), as well
- * as for non-integer types that do not need swapping such as string_views.
- */
-
-struct ByteStream {
-    enum Endian {
-        Little  = 0,
-        Big     = 1,
-#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
-        Native  = Little
-#else
-        Native  = Big
-#endif
-    };
-    template<typename T> using Vector = lsl::Vector<T>;
-    using Allocator = lsl::Allocator;
-    using value_type = std::byte;
-
-    ByteStream(Allocator& allocator) : _bytes(allocator) {}
-    using iterator = Vector<std::byte>::iterator;
-    using const_iterator = Vector<std::byte>::const_iterator;
-    iterator begin() {
-        return _bytes.begin();
-    }
-    iterator end() {
-        return _bytes.end();
-    }
-    const_iterator begin() const {
-        return _bytes.begin();
-    }
-    const_iterator end() const {
-        return _bytes.end();
-    }
-    const_iterator cbegin() const {
-        return _bytes.begin();
-    }
-    const_iterator cend() const {
-        return _bytes.end();
-    }
-
-    template<typename T>
-    void push_back(T value) {
-        if (_endian != Endian::Native) {
-            if constexpr(sizeof(T) == 2) {
-                value = __builtin_bswap16(value);
-            } else if constexpr(sizeof(T) == 4) {
-                value = __builtin_bswap32(value);
-            } else if constexpr(sizeof(T) == 8) {
-                value = __builtin_bswap64(value);
-            }
-        }
-        std::byte* swappedValueBytes = reinterpret_cast<std::byte*>(&value);
-        std::copy(swappedValueBytes, swappedValueBytes+sizeof(T), std::back_inserter(_bytes));
-    }
-
-    template<>
-    void push_back<std::byte>(std::byte value) {
-        _bytes.push_back(value);
-    }
-
-    template<>
-    void push_back<uint8_t>(uint8_t value) {
-        _bytes.push_back(std::byte{value});
-    }
-
-    template<>
-    void push_back<std::string_view>(std::string_view value) {
-        (void)_bytes.insert(_bytes.end(), (std::byte*)&*value.begin(), (std::byte*)&*value.end());
-    }
-
-    template<>
-    void push_back<const char*>(const char* value) {
-       (void)_bytes.insert(_bytes.end(), (std::byte*)value, (std::byte*)value+strlen(value));
-    }
-
-    void push_back(uint8_t size, uint64_t value) {
-        switch (size) {
-            case 1: push_back((uint8_t)value); break;
-            case 2: push_back((uint16_t)value); break;
-            case 4: push_back((uint32_t)value); break;
-            case 8: push_back((uint64_t)value); break;
-        }
-    }
-
-    uint64_t size() const {
-        return _bytes.size();
-    }
-    void resize(uint64_t newCapacity) {
-        _bytes.resize(newCapacity);
-    }
-    void clear() {
-        _bytes.clear();
-    }
-    Allocator& allocator() {
-        return *_bytes.allocator();
-    }
-    void setEndian(Endian endian) {
-        _endian = endian;
-    }
-    std::byte* bytes() {
-        return _bytes.data();
-    }
-    const std::byte* bytes() const {
-        return _bytes.data();
-    }
-    std::byte&          operator[](uint64_t pos)       { return _bytes[pos]; }
-    const std::byte&    operator[](uint64_t pos) const { return _bytes[pos]; }
-
-    template< class InputIt >
-    iterator insert(const_iterator pos, InputIt first, InputIt last ) {
-        return _bytes.insert(pos, first, last);
-    }
-    const std::span<std::byte> span() const {
-        if (_bytes.empty()) { return std::span<std::byte>(); }
-        return std::span((std::byte*)_bytes.data(), (size_t)_bytes.size());
-    }
-private:
-    Vector<std::byte>   _bytes;
-    Endian              _endian = Endian::Little;
-};
-
-
-#endif /* ByteStream_h */