@@ -22,6 +22,17 @@ macro_rules! dispatch_fn {
2222 } ;
2323}
2424
25+ macro_rules! parse_common_header {
26+ ( $self: expr, $data: expr, $pos: expr) => {
27+ ( || -> Result <( u16 , u16 , u64 ) > {
28+ let stock_locate = $self. read_u16( $data, $pos) ?;
29+ let tracking_number = $self. read_u16( $data, $pos) ?;
30+ let timestamp = $self. read_timestamp( $data, $pos) ?;
31+ Ok ( ( stock_locate, tracking_number, timestamp) )
32+ } ) ( )
33+ } ;
34+ }
35+
2536#[ repr( C , align( 64 ) ) ]
2637pub struct Parser {
2738 buffer : Vec < u8 > ,
@@ -490,19 +501,18 @@ impl Parser {
490501
491502 #[ inline]
492503 fn parse_system_event ( & self , data : & [ u8 ] , pos : & mut usize ) -> Result < SystemEventMessage > {
504+ let ( stock_locate, tracking_number, timestamp) = parse_common_header ! ( self , data, pos) ?;
493505 Ok ( SystemEventMessage {
494- stock_locate : self . read_u16 ( data , pos ) ? ,
495- tracking_number : self . read_u16 ( data , pos ) ? ,
496- timestamp : self . read_timestamp ( data , pos ) ? ,
506+ stock_locate,
507+ tracking_number,
508+ timestamp,
497509 event_code : self . read_u8 ( data, pos) ? as char ,
498510 } )
499511 }
500512
501513 #[ inline]
502514 fn parse_stock_directory ( & self , data : & [ u8 ] , pos : & mut usize ) -> Result < StockDirectoryMessage > {
503- let stock_locate = self . read_u16 ( data, pos) ?;
504- let tracking_number = self . read_u16 ( data, pos) ?;
505- let timestamp = self . read_timestamp ( data, pos) ?;
515+ let ( stock_locate, tracking_number, timestamp) = parse_common_header ! ( self , data, pos) ?;
506516 let stock = self . read_stock ( data, pos) ?;
507517 let end = stock. iter ( ) . position ( |& b| b == b' ' ) . unwrap_or ( 8 ) ;
508518 std:: str:: from_utf8 ( & stock[ ..end] )
@@ -537,9 +547,7 @@ impl Parser {
537547 data : & [ u8 ] ,
538548 pos : & mut usize ,
539549 ) -> Result < StockTradingActionMessage > {
540- let stock_locate = self . read_u16 ( data, pos) ?;
541- let tracking_number = self . read_u16 ( data, pos) ?;
542- let timestamp = self . read_timestamp ( data, pos) ?;
550+ let ( stock_locate, tracking_number, timestamp) = parse_common_header ! ( self , data, pos) ?;
543551 let stock = self . read_stock ( data, pos) ?;
544552 let end = stock. iter ( ) . position ( |& b| b == b' ' ) . unwrap_or ( 8 ) ;
545553 std:: str:: from_utf8 ( & stock[ ..end] )
@@ -565,9 +573,7 @@ impl Parser {
565573 data : & [ u8 ] ,
566574 pos : & mut usize ,
567575 ) -> Result < RegShoRestrictionMessage > {
568- let stock_locate = self . read_u16 ( data, pos) ?;
569- let tracking_number = self . read_u16 ( data, pos) ?;
570- let timestamp = self . read_timestamp ( data, pos) ?;
576+ let ( stock_locate, tracking_number, timestamp) = parse_common_header ! ( self , data, pos) ?;
571577 let stock = self . read_stock ( data, pos) ?;
572578 let end = stock. iter ( ) . position ( |& b| b == b' ' ) . unwrap_or ( 8 ) ;
573579 std:: str:: from_utf8 ( & stock[ ..end] )
@@ -589,9 +595,7 @@ impl Parser {
589595 data : & [ u8 ] ,
590596 pos : & mut usize ,
591597 ) -> Result < MarketParticipantPositionMessage > {
592- let stock_locate = self . read_u16 ( data, pos) ?;
593- let tracking_number = self . read_u16 ( data, pos) ?;
594- let timestamp = self . read_timestamp ( data, pos) ?;
598+ let ( stock_locate, tracking_number, timestamp) = parse_common_header ! ( self , data, pos) ?;
595599 let mpid = self . read_mpid ( data, pos) ?;
596600 let end_mpid = mpid. iter ( ) . position ( |& b| b == b' ' ) . unwrap_or ( 4 ) ;
597601 std:: str:: from_utf8 ( & mpid[ ..end_mpid] )
@@ -622,10 +626,11 @@ impl Parser {
622626 data : & [ u8 ] ,
623627 pos : & mut usize ,
624628 ) -> Result < MwcbDeclineLevelMessage > {
629+ let ( stock_locate, tracking_number, timestamp) = parse_common_header ! ( self , data, pos) ?;
625630 Ok ( MwcbDeclineLevelMessage {
626- stock_locate : self . read_u16 ( data , pos ) ? ,
627- tracking_number : self . read_u16 ( data , pos ) ? ,
628- timestamp : self . read_timestamp ( data , pos ) ? ,
631+ stock_locate,
632+ tracking_number,
633+ timestamp,
629634 level1 : self . read_u64 ( data, pos) ?,
630635 level2 : self . read_u64 ( data, pos) ?,
631636 level3 : self . read_u64 ( data, pos) ?,
@@ -634,10 +639,11 @@ impl Parser {
634639
635640 #[ inline]
636641 fn parse_mwcb_status ( & self , data : & [ u8 ] , pos : & mut usize ) -> Result < MwcbStatusMessage > {
642+ let ( stock_locate, tracking_number, timestamp) = parse_common_header ! ( self , data, pos) ?;
637643 Ok ( MwcbStatusMessage {
638- stock_locate : self . read_u16 ( data , pos ) ? ,
639- tracking_number : self . read_u16 ( data , pos ) ? ,
640- timestamp : self . read_timestamp ( data , pos ) ? ,
644+ stock_locate,
645+ tracking_number,
646+ timestamp,
641647 breached_level : self . read_u8 ( data, pos) ? as char ,
642648 } )
643649 }
@@ -648,9 +654,7 @@ impl Parser {
648654 data : & [ u8 ] ,
649655 pos : & mut usize ,
650656 ) -> Result < IpoQuotingPeriodMessage > {
651- let stock_locate = self . read_u16 ( data, pos) ?;
652- let tracking_number = self . read_u16 ( data, pos) ?;
653- let timestamp = self . read_timestamp ( data, pos) ?;
657+ let ( stock_locate, tracking_number, timestamp) = parse_common_header ! ( self , data, pos) ?;
654658 let stock = self . read_stock ( data, pos) ?;
655659 let end = stock. iter ( ) . position ( |& b| b == b' ' ) . unwrap_or ( 8 ) ;
656660 std:: str:: from_utf8 ( & stock[ ..end] )
@@ -669,9 +673,7 @@ impl Parser {
669673
670674 #[ inline]
671675 fn parse_add_order ( & self , data : & [ u8 ] , pos : & mut usize ) -> Result < AddOrderMessage > {
672- let stock_locate = self . read_u16 ( data, pos) ?;
673- let tracking_number = self . read_u16 ( data, pos) ?;
674- let timestamp = self . read_timestamp ( data, pos) ?;
676+ let ( stock_locate, tracking_number, timestamp) = parse_common_header ! ( self , data, pos) ?;
675677 let order_reference_number = self . read_u64 ( data, pos) ?;
676678 let buy_sell_indicator = self . read_u8 ( data, pos) ? as char ;
677679 let shares = self . read_u32 ( data, pos) ?;
@@ -698,9 +700,7 @@ impl Parser {
698700 data : & [ u8 ] ,
699701 pos : & mut usize ,
700702 ) -> Result < AddOrderWithMpidMessage > {
701- let stock_locate = self . read_u16 ( data, pos) ?;
702- let tracking_number = self . read_u16 ( data, pos) ?;
703- let timestamp = self . read_timestamp ( data, pos) ?;
703+ let ( stock_locate, tracking_number, timestamp) = parse_common_header ! ( self , data, pos) ?;
704704 let order_reference_number = self . read_u64 ( data, pos) ?;
705705 let buy_sell_indicator = self . read_u8 ( data, pos) ? as char ;
706706 let shares = self . read_u32 ( data, pos) ?;
@@ -730,10 +730,11 @@ impl Parser {
730730
731731 #[ inline]
732732 fn parse_order_executed ( & self , data : & [ u8 ] , pos : & mut usize ) -> Result < OrderExecutedMessage > {
733+ let ( stock_locate, tracking_number, timestamp) = parse_common_header ! ( self , data, pos) ?;
733734 Ok ( OrderExecutedMessage {
734- stock_locate : self . read_u16 ( data , pos ) ? ,
735- tracking_number : self . read_u16 ( data , pos ) ? ,
736- timestamp : self . read_timestamp ( data , pos ) ? ,
735+ stock_locate,
736+ tracking_number,
737+ timestamp,
737738 order_reference_number : self . read_u64 ( data, pos) ?,
738739 executed_shares : self . read_u32 ( data, pos) ?,
739740 match_number : self . read_u64 ( data, pos) ?,
@@ -746,10 +747,11 @@ impl Parser {
746747 data : & [ u8 ] ,
747748 pos : & mut usize ,
748749 ) -> Result < OrderExecutedWithPriceMessage > {
750+ let ( stock_locate, tracking_number, timestamp) = parse_common_header ! ( self , data, pos) ?;
749751 Ok ( OrderExecutedWithPriceMessage {
750- stock_locate : self . read_u16 ( data , pos ) ? ,
751- tracking_number : self . read_u16 ( data , pos ) ? ,
752- timestamp : self . read_timestamp ( data , pos ) ? ,
752+ stock_locate,
753+ tracking_number,
754+ timestamp,
753755 order_reference_number : self . read_u64 ( data, pos) ?,
754756 executed_shares : self . read_u32 ( data, pos) ?,
755757 match_number : self . read_u64 ( data, pos) ?,
@@ -760,31 +762,34 @@ impl Parser {
760762
761763 #[ inline]
762764 fn parse_order_cancel ( & self , data : & [ u8 ] , pos : & mut usize ) -> Result < OrderCancelMessage > {
765+ let ( stock_locate, tracking_number, timestamp) = parse_common_header ! ( self , data, pos) ?;
763766 Ok ( OrderCancelMessage {
764- stock_locate : self . read_u16 ( data , pos ) ? ,
765- tracking_number : self . read_u16 ( data , pos ) ? ,
766- timestamp : self . read_timestamp ( data , pos ) ? ,
767+ stock_locate,
768+ tracking_number,
769+ timestamp,
767770 order_reference_number : self . read_u64 ( data, pos) ?,
768771 cancelled_shares : self . read_u32 ( data, pos) ?,
769772 } )
770773 }
771774
772775 #[ inline]
773776 fn parse_order_delete ( & self , data : & [ u8 ] , pos : & mut usize ) -> Result < OrderDeleteMessage > {
777+ let ( stock_locate, tracking_number, timestamp) = parse_common_header ! ( self , data, pos) ?;
774778 Ok ( OrderDeleteMessage {
775- stock_locate : self . read_u16 ( data , pos ) ? ,
776- tracking_number : self . read_u16 ( data , pos ) ? ,
777- timestamp : self . read_timestamp ( data , pos ) ? ,
779+ stock_locate,
780+ tracking_number,
781+ timestamp,
778782 order_reference_number : self . read_u64 ( data, pos) ?,
779783 } )
780784 }
781785
782786 #[ inline]
783787 fn parse_order_replace ( & self , data : & [ u8 ] , pos : & mut usize ) -> Result < OrderReplaceMessage > {
788+ let ( stock_locate, tracking_number, timestamp) = parse_common_header ! ( self , data, pos) ?;
784789 Ok ( OrderReplaceMessage {
785- stock_locate : self . read_u16 ( data , pos ) ? ,
786- tracking_number : self . read_u16 ( data , pos ) ? ,
787- timestamp : self . read_timestamp ( data , pos ) ? ,
790+ stock_locate,
791+ tracking_number,
792+ timestamp,
788793 original_order_reference_number : self . read_u64 ( data, pos) ?,
789794 new_order_reference_number : self . read_u64 ( data, pos) ?,
790795 shares : self . read_u32 ( data, pos) ?,
@@ -794,9 +799,7 @@ impl Parser {
794799
795800 #[ inline]
796801 fn parse_trade ( & self , data : & [ u8 ] , pos : & mut usize ) -> Result < TradeMessage > {
797- let stock_locate = self . read_u16 ( data, pos) ?;
798- let tracking_number = self . read_u16 ( data, pos) ?;
799- let timestamp = self . read_timestamp ( data, pos) ?;
802+ let ( stock_locate, tracking_number, timestamp) = parse_common_header ! ( self , data, pos) ?;
800803 let order_reference_number = self . read_u64 ( data, pos) ?;
801804 let buy_sell_indicator = self . read_u8 ( data, pos) ? as char ;
802805 let shares = self . read_u32 ( data, pos) ?;
0 commit comments