Imported Upstream version 8.2.2
[platform/upstream/harfbuzz.git] / src / OT / Layout / GPOS / PairPos.hh
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>
26   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