damus

nostr ios client
git clone git://jb55.com/damus
Log | Files | Refs | README | LICENSE

Mutable.swift (2980B)


      1 /*
      2  * Copyright 2023 Google Inc. All rights reserved.
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *     http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #if !os(WASI)
     18 import Foundation
     19 #else
     20 import SwiftOverlayShims
     21 #endif
     22 
     23 /// Mutable is a protocol that allows us to mutate Scalar values within a ``ByteBuffer``
     24 public protocol Mutable {
     25   /// makes Flatbuffer accessed within the Protocol
     26   var bb: ByteBuffer { get }
     27   /// makes position of the ``Table``/``struct`` accessed within the Protocol
     28   var postion: Int32 { get }
     29 }
     30 
     31 extension Mutable {
     32 
     33   /// Mutates the memory in the buffer, this is only called from the access function of ``Table`` and ``struct``
     34   /// - Parameters:
     35   ///   - value: New value to be inserted to the buffer
     36   ///   - index: index of the Element
     37   func mutate<T: Scalar>(value: T, o: Int32) -> Bool {
     38     guard o != 0 else { return false }
     39     bb.write(value: value, index: Int(o), direct: true)
     40     return true
     41   }
     42 }
     43 
     44 extension Mutable where Self == Table {
     45 
     46   /// Mutates a value by calling mutate with respect to the position in a ``Table``
     47   /// - Parameters:
     48   ///   - value: New value to be inserted to the buffer
     49   ///   - index: index of the Element
     50   public func mutate<T: Scalar>(_ value: T, index: Int32) -> Bool {
     51     guard index != 0 else { return false }
     52     return mutate(value: value, o: index + postion)
     53   }
     54 
     55   /// Directly mutates the element by calling mutate
     56   ///
     57   /// Mutates the Element at index ignoring the current position by calling mutate
     58   /// - Parameters:
     59   ///   - value: New value to be inserted to the buffer
     60   ///   - index: index of the Element
     61   public func directMutate<T: Scalar>(_ value: T, index: Int32) -> Bool {
     62     mutate(value: value, o: index)
     63   }
     64 }
     65 
     66 extension Mutable where Self == Struct {
     67 
     68   /// Mutates a value by calling mutate with respect to the position in the struct
     69   /// - Parameters:
     70   ///   - value: New value to be inserted to the buffer
     71   ///   - index: index of the Element
     72   public func mutate<T: Scalar>(_ value: T, index: Int32) -> Bool {
     73     mutate(value: value, o: index + postion)
     74   }
     75 
     76   /// Directly mutates the element by calling mutate
     77   ///
     78   /// Mutates the Element at index ignoring the current position by calling mutate
     79   /// - Parameters:
     80   ///   - value: New value to be inserted to the buffer
     81   ///   - index: index of the Element
     82   public func directMutate<T: Scalar>(_ value: T, index: Int32) -> Bool {
     83     mutate(value: value, o: index)
     84   }
     85 }
     86 
     87 extension Struct: Mutable {}
     88 extension Table: Mutable {}