@@ -31,6 +31,8 @@ import Foundation
3131/// used for serialization. It is implemented by each serialization protocol:
3232/// Protobuf Binary, Protobuf Text, JSON, and the Hash encoder.
3333public protocol Visitor {
34+
35+ var traversalOptions : TraversalOptions { get }
3436
3537 /// Called for each non-repeated float field
3638 ///
@@ -445,8 +447,27 @@ public protocol Visitor {
445447 mutating func visitUnknown( bytes: Data ) throws
446448}
447449
450+ /// Provides options for how visitor traversal should be carried out
451+ public struct TraversalOptions {
452+ static let `default` = TraversalOptions ( )
453+
454+ /// Determines if non-optional fields that are equal to their default values should be visited.
455+ /// Defaults to `false`.
456+ public var visitDefaultValues : Bool
457+
458+ public init ( visitDefaultValues: Bool = false ) {
459+ self . visitDefaultValues = visitDefaultValues
460+ }
461+ }
462+
463+
448464/// Forwarding default implementations of some visitor methods, for convenience.
449465extension Visitor {
466+
467+ // Use the default traversal options if not set
468+ public var traversalOptions : TraversalOptions {
469+ . default
470+ }
450471
451472 // Default definitions of numeric serializations.
452473 //
@@ -492,126 +513,108 @@ extension Visitor {
492513 // repeated values differently from singular, so overrides these.
493514
494515 public mutating func visitRepeatedFloatField( value: [ Float ] , fieldNumber: Int ) throws {
495- assert ( !value. isEmpty)
496516 for v in value {
497517 try visitSingularFloatField ( value: v, fieldNumber: fieldNumber)
498518 }
499519 }
500520
501521 public mutating func visitRepeatedDoubleField( value: [ Double ] , fieldNumber: Int ) throws {
502- assert ( !value. isEmpty)
503522 for v in value {
504523 try visitSingularDoubleField ( value: v, fieldNumber: fieldNumber)
505524 }
506525 }
507526
508527 public mutating func visitRepeatedInt32Field( value: [ Int32 ] , fieldNumber: Int ) throws {
509- assert ( !value. isEmpty)
510528 for v in value {
511529 try visitSingularInt32Field ( value: v, fieldNumber: fieldNumber)
512530 }
513531 }
514532
515533 public mutating func visitRepeatedInt64Field( value: [ Int64 ] , fieldNumber: Int ) throws {
516- assert ( !value. isEmpty)
517534 for v in value {
518535 try visitSingularInt64Field ( value: v, fieldNumber: fieldNumber)
519536 }
520537 }
521538
522539 public mutating func visitRepeatedUInt32Field( value: [ UInt32 ] , fieldNumber: Int ) throws {
523- assert ( !value. isEmpty)
524540 for v in value {
525541 try visitSingularUInt32Field ( value: v, fieldNumber: fieldNumber)
526542 }
527543 }
528544
529545 public mutating func visitRepeatedUInt64Field( value: [ UInt64 ] , fieldNumber: Int ) throws {
530- assert ( !value. isEmpty)
531546 for v in value {
532547 try visitSingularUInt64Field ( value: v, fieldNumber: fieldNumber)
533548 }
534549 }
535550
536551 public mutating func visitRepeatedSInt32Field( value: [ Int32 ] , fieldNumber: Int ) throws {
537- assert ( !value. isEmpty)
538552 for v in value {
539553 try visitSingularSInt32Field ( value: v, fieldNumber: fieldNumber)
540554 }
541555 }
542556
543557 public mutating func visitRepeatedSInt64Field( value: [ Int64 ] , fieldNumber: Int ) throws {
544- assert ( !value. isEmpty)
545558 for v in value {
546559 try visitSingularSInt64Field ( value: v, fieldNumber: fieldNumber)
547560 }
548561 }
549562
550563 public mutating func visitRepeatedFixed32Field( value: [ UInt32 ] , fieldNumber: Int ) throws {
551- assert ( !value. isEmpty)
552564 for v in value {
553565 try visitSingularFixed32Field ( value: v, fieldNumber: fieldNumber)
554566 }
555567 }
556568
557569 public mutating func visitRepeatedFixed64Field( value: [ UInt64 ] , fieldNumber: Int ) throws {
558- assert ( !value. isEmpty)
559570 for v in value {
560571 try visitSingularFixed64Field ( value: v, fieldNumber: fieldNumber)
561572 }
562573 }
563574
564575 public mutating func visitRepeatedSFixed32Field( value: [ Int32 ] , fieldNumber: Int ) throws {
565- assert ( !value. isEmpty)
566576 for v in value {
567577 try visitSingularSFixed32Field ( value: v, fieldNumber: fieldNumber)
568578 }
569579 }
570580
571581 public mutating func visitRepeatedSFixed64Field( value: [ Int64 ] , fieldNumber: Int ) throws {
572- assert ( !value. isEmpty)
573582 for v in value {
574583 try visitSingularSFixed64Field ( value: v, fieldNumber: fieldNumber)
575584 }
576585 }
577586
578587 public mutating func visitRepeatedBoolField( value: [ Bool ] , fieldNumber: Int ) throws {
579- assert ( !value. isEmpty)
580588 for v in value {
581589 try visitSingularBoolField ( value: v, fieldNumber: fieldNumber)
582590 }
583591 }
584592
585593 public mutating func visitRepeatedStringField( value: [ String ] , fieldNumber: Int ) throws {
586- assert ( !value. isEmpty)
587594 for v in value {
588595 try visitSingularStringField ( value: v, fieldNumber: fieldNumber)
589596 }
590597 }
591598
592599 public mutating func visitRepeatedBytesField( value: [ Data ] , fieldNumber: Int ) throws {
593- assert ( !value. isEmpty)
594600 for v in value {
595601 try visitSingularBytesField ( value: v, fieldNumber: fieldNumber)
596602 }
597603 }
598604
599605 public mutating func visitRepeatedEnumField< E: Enum > ( value: [ E ] , fieldNumber: Int ) throws {
600- assert ( !value. isEmpty)
601606 for v in value {
602607 try visitSingularEnumField ( value: v, fieldNumber: fieldNumber)
603608 }
604609 }
605610
606611 public mutating func visitRepeatedMessageField< M: Message > ( value: [ M ] , fieldNumber: Int ) throws {
607- assert ( !value. isEmpty)
608612 for v in value {
609613 try visitSingularMessageField ( value: v, fieldNumber: fieldNumber)
610614 }
611615 }
612616
613617 public mutating func visitRepeatedGroupField< G: Message > ( value: [ G ] , fieldNumber: Int ) throws {
614- assert ( !value. isEmpty)
615618 for v in value {
616619 try visitSingularGroupField ( value: v, fieldNumber: fieldNumber)
617620 }
@@ -623,73 +626,59 @@ extension Visitor {
623626 // overridden by Protobuf Binary and Text.
624627
625628 public mutating func visitPackedFloatField( value: [ Float ] , fieldNumber: Int ) throws {
626- assert ( !value. isEmpty)
627629 try visitRepeatedFloatField ( value: value, fieldNumber: fieldNumber)
628630 }
629631
630632 public mutating func visitPackedDoubleField( value: [ Double ] , fieldNumber: Int ) throws {
631- assert ( !value. isEmpty)
632633 try visitRepeatedDoubleField ( value: value, fieldNumber: fieldNumber)
633634 }
634635
635636 public mutating func visitPackedInt32Field( value: [ Int32 ] , fieldNumber: Int ) throws {
636- assert ( !value. isEmpty)
637637 try visitRepeatedInt32Field ( value: value, fieldNumber: fieldNumber)
638638 }
639639
640640 public mutating func visitPackedInt64Field( value: [ Int64 ] , fieldNumber: Int ) throws {
641- assert ( !value. isEmpty)
642641 try visitRepeatedInt64Field ( value: value, fieldNumber: fieldNumber)
643642 }
644643
645644 public mutating func visitPackedUInt32Field( value: [ UInt32 ] , fieldNumber: Int ) throws {
646- assert ( !value. isEmpty)
647645 try visitRepeatedUInt32Field ( value: value, fieldNumber: fieldNumber)
648646 }
649647
650648 public mutating func visitPackedUInt64Field( value: [ UInt64 ] , fieldNumber: Int ) throws {
651- assert ( !value. isEmpty)
652649 try visitRepeatedUInt64Field ( value: value, fieldNumber: fieldNumber)
653650 }
654651
655652 public mutating func visitPackedSInt32Field( value: [ Int32 ] , fieldNumber: Int ) throws {
656- assert ( !value. isEmpty)
657653 try visitPackedInt32Field ( value: value, fieldNumber: fieldNumber)
658654 }
659655
660656 public mutating func visitPackedSInt64Field( value: [ Int64 ] , fieldNumber: Int ) throws {
661- assert ( !value. isEmpty)
662657 try visitPackedInt64Field ( value: value, fieldNumber: fieldNumber)
663658 }
664659
665660 public mutating func visitPackedFixed32Field( value: [ UInt32 ] , fieldNumber: Int ) throws {
666- assert ( !value. isEmpty)
667661 try visitPackedUInt32Field ( value: value, fieldNumber: fieldNumber)
668662 }
669663
670664 public mutating func visitPackedFixed64Field( value: [ UInt64 ] , fieldNumber: Int ) throws {
671- assert ( !value. isEmpty)
672665 try visitPackedUInt64Field ( value: value, fieldNumber: fieldNumber)
673666 }
674667
675668 public mutating func visitPackedSFixed32Field( value: [ Int32 ] , fieldNumber: Int ) throws {
676- assert ( !value. isEmpty)
677669 try visitPackedInt32Field ( value: value, fieldNumber: fieldNumber)
678670 }
679671
680672 public mutating func visitPackedSFixed64Field( value: [ Int64 ] , fieldNumber: Int ) throws {
681- assert ( !value. isEmpty)
682673 try visitPackedInt64Field ( value: value, fieldNumber: fieldNumber)
683674 }
684675
685676 public mutating func visitPackedBoolField( value: [ Bool ] , fieldNumber: Int ) throws {
686- assert ( !value. isEmpty)
687677 try visitRepeatedBoolField ( value: value, fieldNumber: fieldNumber)
688678 }
689679
690680 public mutating func visitPackedEnumField< E: Enum > ( value: [ E ] ,
691681 fieldNumber: Int ) throws {
692- assert ( !value. isEmpty)
693682 try visitRepeatedEnumField ( value: value, fieldNumber: fieldNumber)
694683 }
695684
0 commit comments