6 #include "tile_count.h" 7 #include "../unit/action.h" 8 #include "../unit/meld.h" 28 Hand &operator=(
const Hand &assign) =
default;
29 Hand &operator=(
Hand &&moveAssign) =
default;
32 const T37 &drawn()
const;
33 const T37 &outFor(
const Action &action)
const;
36 bool hasDrawn()
const;
37 bool isMenzen()
const;
44 bool canChii(
T34 t)
const;
45 bool canChiiAsLeft(
T34 t)
const;
46 bool canChiiAsMiddle(
T34 t)
const;
47 bool canChiiAsRight(
T34 t)
const;
48 bool canPon(
T34 t)
const;
49 bool canCp(
T34 pick,
const Action &action)
const;
50 bool canDaiminkan(
T34 t)
const;
53 bool canRon(
T34 t,
const FormCtx &info,
const Rule &rule,
bool &doujun)
const;
54 bool canTsumo(
const FormCtx &info,
const Rule &rule)
const;
65 bool hasEffA(
T34 t)
const;
66 bool hasEffA4(
T34 t)
const;
67 bool hasEffA7(
T34 t)
const;
68 bool hasEffA13(
T34 t)
const;
78 int peekPickStep(
T34 pick)
const;
79 int peekPickStep4(
T34 pick)
const;
80 int peekPickStep7(
T34 pick)
const;
81 int peekPickStep7Gb(
T34 pick)
const;
82 int peekPickStep13(
T34 pick)
const;
84 template<
typename Ret,
typename... Params,
typename... Args>
85 Ret peekDiscard(
const Action &a, Ret (
Hand::*f) (Params...)
const, Args && ... args)
const 88 case ActCode::SWAP_OUT:
89 return peekSwap(a.t37(), f, std::forward<Args>(args) ...);
90 case ActCode::SPIN_OUT:
91 return peekSpin(f, std::forward<Args>(args) ...);
97 template<
typename Ret,
typename... Params,
typename... Args>
98 Ret peekSwap(
const T37 &t, Ret (
Hand::*f) (Params...)
const, Args && ... args)
const 100 DeltaSwap guard(const_cast<Hand &>(*
this), t);
102 return (this->*f)(std::forward<Args>(args) ...);
105 template<
typename Ret,
typename... Params,
typename... Args>
106 Ret peekSpin(Ret (
Hand::*f) (Params...)
const, Args && ... args)
const 108 DeltaSpin guard(const_cast<Hand &>(*
this));
110 return (this->*f)(std::forward<Args>(args) ...);
113 template<
typename Ret,
typename... Params,
typename... Args>
114 Ret peekCp(
const T37 &pick,
const Action &action,
115 Ret (
Hand::*f) (Params...)
const, Args && ... args)
const 117 assert(action.isCp());
118 DeltaCp guard(const_cast<Hand &>(*
this), pick, action, action.t37());
120 return (this->*f)(std::forward<Args>(args) ...);
123 void draw(
const T37 &in);
124 void swapOut(
const T37 &out);
126 void barkOut(
const T37 &out);
127 void chiiAsLeft(
const T37 &pick,
bool showAka5);
128 void chiiAsMiddle(
const T37 &pick,
bool showAka5);
129 void chiiAsRight(
const T37 &pick,
bool showAka5);
130 void pon(
const T37 &pick,
int showAka5,
int layIndex);
131 void daiminkan(
const T37 &pick,
int layIndex);
133 void kakan(
int barkId);
139 explicit DeltaSpin(
Hand &hand);
142 DeltaSpin(
const DeltaSpin ©) =
delete;
143 DeltaSpin &operator=(
const DeltaSpin &assign) =
delete;
152 explicit DeltaSwap(
Hand &hand,
const T37 &out);
155 DeltaSwap(
const DeltaSwap ©) =
delete;
156 DeltaSwap &operator=(
const DeltaSwap &assign) =
delete;
166 explicit DeltaCp(
Hand &hand,
const T37 &pick,
const Action &a,
const T37 &out);
169 DeltaCp(
const DeltaCp ©) =
delete;
170 DeltaCp &operator=(
const DeltaCp &assign) =
delete;
177 using SwapOk = std::function<bool(T34)>;
179 bool usingCache()
const;
180 const Parseds &loadCache()
const;
182 bool hasSwappableAfterChii(
T34 mat1,
T34 mat2, SwapOk ok)
const;
183 bool shouldShowAka5(
T34 show,
bool showAka5)
const;
184 T37 tryShow(
T34 t,
bool showAka5);
187 template<
typename Ret,
typename... Params,
typename... Args>
188 Ret peekStay(Ret (
TileCount::*f)(Params...)
const, Args... args)
const 190 return mHasDrawn ? mClosed.peekDraw<Ret, Params...>(mDrawn, f, args...)
191 : (mClosed.*f)(args...);
197 bool mHasDrawn =
false;
199 mutable std::optional<Parseds> mParseCache;
200 mutable int mSkipCacheLevel = 0;
203 int operator%(
T34 ind,
const Hand &hand);
212 #endif // SAKI_HAND_H
Definition: tile_count.h:17
Stactor = statically allocated vector.
Definition: stactor.h:247