xref: /aosp_15_r20/external/harfbuzz_ng/src/OT/Layout/GPOS/PairPos.hh (revision 2d1272b857b1f7575e6e246373e1cb218663db8a)
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