         case unknownType(GAPDataType)
     }
     
-    public init() { }
+    // MARK: - Initialization
+    
+    /// Initialize with default data types.
+    public init() {
+        
+        /// initialize with default precomputed values
+        self.types = GAPDataDecoder.defaultTypes
+        self.dataTypes = GAPDataDecoder.defaultDataTypes
+    }
+    
+    // MARK: - Properties
     
     public var ignoreUnknownType: Bool = false
     
-    public var types: [GAPData.Type] = gapDataTypes
+    public var types = [GAPData.Type]() {
+        didSet {
+            dataTypes = [GAPDataType: GAPData.Type](minimumCapacity: types.count)
+            types.forEach { dataTypes[$0.dataType] = $0 }
+        }
+    }
+    
+    internal private(set) var dataTypes: [GAPDataType: GAPData.Type] = [:]
+    
+    // MARK: - Methods
     
     public func decode(_ data: LowEnergyAdvertisingData) throws -> [GAPData] {
         


public extension GAP {
    
    public typealias DataEncoder = GAPDataEncoder
}

public struct GAPDataEncoder {
    
    public enum Error: Swift.Error {
        
        case invalidSize(Int)
    }
    
    public init() { }
    
    public func encode(_ encodables: GAPData...) -> Data {
        

    }
}

/// GAP Data Decoder
public struct GAPDataDecoder {
    
    /// GAP Data Decoder Error
    public enum Error: Swift.Error {
        
        case insufficientBytes(expected: Int, actual: Int)
