def ObjectiveCBridgeableImplementationForNSValue(Type):
    return """
extension {Type}: _ObjectiveCBridgeable {{
  public func _bridgeToObjectiveC() -> NSValue {{
    var myself = self
    return NSValue(bytes: &myself, objCType: _getObjCTypeEncoding({Type}.self))
  }}

  public static func _forceBridgeFromObjectiveC(_ source: NSValue,
                                                result: inout {Type}?) {{
    precondition(strcmp(source.objCType,
                        _getObjCTypeEncoding({Type}.self)) == 0,
                 "NSValue does not contain the right type to bridge to {Type}")
    result = {Type}()
    source.getValue(&result!)
  }}

  public static func _conditionallyBridgeFromObjectiveC(_ source: NSValue,
                                                        result: inout {Type}?)
      -> Bool {{
    if strcmp(source.objCType, _getObjCTypeEncoding({Type}.self)) != 0 {{
      result = nil
      return false
    }}
    result = {Type}()
    source.getValue(&result!)
    return true
  }}

  public static func _unconditionallyBridgeFromObjectiveC(_ source: NSValue?)
      -> {Type} {{
    let unwrappedSource = source!
    precondition(strcmp(unwrappedSource.objCType,
                        _getObjCTypeEncoding({Type}.self)) == 0,
                 "NSValue does not contain the right type to bridge to {Type}")
    var result = {Type}()
    unwrappedSource.getValue(&result)
    return result
  }}
}}
""".format(Type=Type)


def ObjectiveCBridgeableImplementationForNSValueWithCategoryMethods(
    Type,
    initializer,
    getter,
    objCType="_getObjCTypeEncoding"
):
    return """
extension {Type}: _ObjectiveCBridgeable {{
  public func _bridgeToObjectiveC() -> NSValue {{
    return {initializer}(self)
  }}

  public static func _forceBridgeFromObjectiveC(_ source: NSValue,
                                                result: inout {Type}?) {{
    precondition(strcmp(source.objCType,
                        {objCType}({Type}.self)) == 0,
                 "NSValue does not contain the right type to bridge to {Type}")
    result = {getter}(source)
  }}

  public static func _conditionallyBridgeFromObjectiveC(_ source: NSValue,
                                                        result: inout {Type}?)
      -> Bool {{
    if strcmp(source.objCType, {objCType}({Type}.self)) != 0 {{
      result = nil
      return false
    }}
    result = {getter}(source)
    return true
  }}

  public static func _unconditionallyBridgeFromObjectiveC(_ source: NSValue?)
      -> {Type} {{
    let unwrappedSource = source!
    precondition(strcmp(unwrappedSource.objCType,
                        {objCType}({Type}.self)) == 0,
                 "NSValue does not contain the right type to bridge to {Type}")
    return {getter}(unwrappedSource)
  }}
}}
""".format(Type=Type, initializer=initializer,
           getter=getter, objCType=objCType)
