mirror of https://github.com/oxen-io/session-ios
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			50 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Swift
		
	
		
		
			
		
	
	
			50 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Swift
		
	
| 
								 
											8 years ago
										 
									 | 
							
								//
							 | 
						||
| 
								 | 
							
								//  Copyright (c) 2018 Open Whisper Systems. All rights reserved.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import Foundation
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								public extension String {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // Truncates string to be less than or equal to byteCount, while ensuring we never truncate partial characters for multibyte characters.
							 | 
						||
| 
								 | 
							
								    public func truncated(toByteCount byteCount: UInt) -> String? {
							 | 
						||
| 
								 | 
							
								        var lowerBoundCharCount = 0
							 | 
						||
| 
								 | 
							
								        var upperBoundCharCount = self.count
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        while (lowerBoundCharCount < upperBoundCharCount) {
							 | 
						||
| 
								 | 
							
								            guard let upperBoundData = self.prefix(upperBoundCharCount).data(using: .utf8) else {
							 | 
						||
| 
								 | 
							
								                owsFail("in \(#function) upperBoundData was unexpectedly nil")
							 | 
						||
| 
								 | 
							
								                return nil
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if upperBoundData.count <= byteCount {
							 | 
						||
| 
								 | 
							
								                break
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            // converge
							 | 
						||
| 
								 | 
							
								            if upperBoundCharCount - lowerBoundCharCount == 1 {
							 | 
						||
| 
								 | 
							
								                upperBoundCharCount = lowerBoundCharCount
							 | 
						||
| 
								 | 
							
								                break
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            let midpointCharCount = (lowerBoundCharCount + upperBoundCharCount) / 2
							 | 
						||
| 
								 | 
							
								            let midpointString = self.prefix(midpointCharCount)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            guard let midpointData = midpointString.data(using: .utf8) else {
							 | 
						||
| 
								 | 
							
								                owsFail("in \(#function) midpointData was unexpectedly nil")
							 | 
						||
| 
								 | 
							
								                return nil
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            let midpointByteCount = midpointData.count
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if midpointByteCount < byteCount {
							 | 
						||
| 
								 | 
							
								                lowerBoundCharCount = midpointCharCount
							 | 
						||
| 
								 | 
							
								            } else {
							 | 
						||
| 
								 | 
							
								                upperBoundCharCount = midpointCharCount
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return String(self.prefix(upperBoundCharCount))
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 |