1 #ifndef OT_LAYOUT_GPOS_PAIRPOS_HH 2 #define OT_LAYOUT_GPOS_PAIRPOS_HH 3 4 #include "PairPosFormat1.hh" 5 #include "PairPosFormat2.hh" 6 7 namespace OT { 8 namespace Layout { 9 namespace GPOS_impl { 10 11 struct PairPos 12 { 13 protected: 14 union { 15 HBUINT16 format; /* Format identifier */ 16 PairPosFormat1_3<SmallTypes> format1; 17 PairPosFormat2_4<SmallTypes> format2; 18 #ifndef HB_NO_BEYOND_64K 19 PairPosFormat1_3<MediumTypes> format3; 20 PairPosFormat2_4<MediumTypes> format4; 21 #endif 22 } u; 23 24 public: 25 template <typename context_t, typename ...Ts> dispatchOT::Layout::GPOS_impl::PairPos26 typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const 27 { 28 if (unlikely (!c->may_dispatch (this, &u.format))) return c->no_dispatch_return_value (); 29 TRACE_DISPATCH (this, u.format); 30 switch (u.format) { 31 case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...)); 32 case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...)); 33 #ifndef HB_NO_BEYOND_64K 34 case 3: return_trace (c->dispatch (u.format3, std::forward<Ts> (ds)...)); 35 case 4: return_trace (c->dispatch (u.format4, std::forward<Ts> (ds)...)); 36 #endif 37 default:return_trace (c->default_return_value ()); 38 } 39 } 40 }; 41 42 } 43 } 44 } 45 46 #endif // OT_LAYOUT_GPOS_PAIRPOS_HH 47