Serenity Operating System
at portability 142 lines 4.4 kB view raw
1/* 2 * Copyright (c) 2020, Andreas Kling <kling@serenityos.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright notice, this 9 * list of conditions and the following disclaimer. 10 * 11 * 2. Redistributions in binary form must reproduce the above copyright notice, 12 * this list of conditions and the following disclaimer in the documentation 13 * and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 18 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 21 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 22 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 23 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 */ 26 27#include <AK/String.h> 28#include <LibIPC/Encoder.h> 29 30namespace IPC { 31 32Encoder& Encoder::operator<<(bool value) 33{ 34 return *this << (u8)value; 35} 36 37Encoder& Encoder::operator<<(u8 value) 38{ 39 m_buffer.append(value); 40 return *this; 41} 42 43Encoder& Encoder::operator<<(u16 value) 44{ 45 m_buffer.ensure_capacity(m_buffer.size() + 2); 46 m_buffer.unchecked_append((u8)value); 47 m_buffer.unchecked_append((u8)(value >> 8)); 48 return *this; 49} 50 51Encoder& Encoder::operator<<(u32 value) 52{ 53 m_buffer.ensure_capacity(m_buffer.size() + 4); 54 m_buffer.unchecked_append((u8)value); 55 m_buffer.unchecked_append((u8)(value >> 8)); 56 m_buffer.unchecked_append((u8)(value >> 16)); 57 m_buffer.unchecked_append((u8)(value >> 24)); 58 return *this; 59} 60 61Encoder& Encoder::operator<<(u64 value) 62{ 63 m_buffer.ensure_capacity(m_buffer.size() + 8); 64 m_buffer.unchecked_append((u8)value); 65 m_buffer.unchecked_append((u8)(value >> 8)); 66 m_buffer.unchecked_append((u8)(value >> 16)); 67 m_buffer.unchecked_append((u8)(value >> 24)); 68 m_buffer.unchecked_append((u8)(value >> 32)); 69 m_buffer.unchecked_append((u8)(value >> 40)); 70 m_buffer.unchecked_append((u8)(value >> 48)); 71 m_buffer.unchecked_append((u8)(value >> 56)); 72 return *this; 73} 74 75Encoder& Encoder::operator<<(i8 value) 76{ 77 m_buffer.append((u8)value); 78 return *this; 79} 80 81Encoder& Encoder::operator<<(i16 value) 82{ 83 m_buffer.ensure_capacity(m_buffer.size() + 2); 84 m_buffer.unchecked_append((u8)value); 85 m_buffer.unchecked_append((u8)(value >> 8)); 86 return *this; 87} 88 89Encoder& Encoder::operator<<(i32 value) 90{ 91 m_buffer.ensure_capacity(m_buffer.size() + 4); 92 m_buffer.unchecked_append((u8)value); 93 m_buffer.unchecked_append((u8)(value >> 8)); 94 m_buffer.unchecked_append((u8)(value >> 16)); 95 m_buffer.unchecked_append((u8)(value >> 24)); 96 return *this; 97} 98 99Encoder& Encoder::operator<<(i64 value) 100{ 101 m_buffer.ensure_capacity(m_buffer.size() + 8); 102 m_buffer.unchecked_append((u8)value); 103 m_buffer.unchecked_append((u8)(value >> 8)); 104 m_buffer.unchecked_append((u8)(value >> 16)); 105 m_buffer.unchecked_append((u8)(value >> 24)); 106 m_buffer.unchecked_append((u8)(value >> 32)); 107 m_buffer.unchecked_append((u8)(value >> 40)); 108 m_buffer.unchecked_append((u8)(value >> 48)); 109 m_buffer.unchecked_append((u8)(value >> 56)); 110 return *this; 111} 112 113Encoder& Encoder::operator<<(float value) 114{ 115 union bits { 116 float as_float; 117 u32 as_u32; 118 } u; 119 u.as_float = value; 120 return *this << u.as_u32; 121} 122 123Encoder& Encoder::operator<<(const char* value) 124{ 125 return *this << StringView(value); 126} 127 128Encoder& Encoder::operator<<(const StringView& value) 129{ 130 m_buffer.append((const u8*)value.characters_without_null_termination(), value.length()); 131 return *this; 132} 133 134Encoder& Encoder::operator<<(const String& value) 135{ 136 if (value.is_null()) 137 return *this << (i32)-1; 138 *this << static_cast<i32>(value.length()); 139 return *this << value.view(); 140} 141 142}