1#ifndef OT_LAYOUT_GPOS_PAIRPOS_HH
2#define OT_LAYOUT_GPOS_PAIRPOS_HH
3
4#include "PairPosFormat1.hh"
5#include "PairPosFormat2.hh"
6
7namespace OT {
8namespace Layout {
9namespace GPOS_impl {
10
11struct 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
47