From c850529257c6f466ca42c1198062ec21225743b8 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 6 Apr 2024 19:41:54 +0100 Subject: [PATCH] Add zobrist hash tables --- src/board/mod.rs | 3 + src/board/zobrist.rs | 978 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 981 insertions(+) create mode 100644 src/board/zobrist.rs diff --git a/src/board/mod.rs b/src/board/mod.rs index 0e34331..83d06e9 100644 --- a/src/board/mod.rs +++ b/src/board/mod.rs @@ -27,3 +27,6 @@ pub use rank::*; pub mod square; pub use square::*; + +pub mod zobrist; +pub use zobrist::*; diff --git a/src/board/zobrist.rs b/src/board/zobrist.rs new file mode 100644 index 0000000..b1d600d --- /dev/null +++ b/src/board/zobrist.rs @@ -0,0 +1,978 @@ +// vim: foldmethod=marker +use super::{CastleRights, Color, File, Piece, Square}; + +type Hash = u64; + +type EnPassantHashesType = [Hash; File::NUM_VARIANTS]; + +type CastlingHashesType = [[Hash; CastleRights::NUM_VARIANTS]; CastleRights::NUM_VARIANTS]; + +type PieceHashesType = [[[Hash; Square::NUM_VARIANTS]; Piece::NUM_VARIANTS]; Color::NUM_VARIANTS]; + +// region:sourcegen {{{ +static BLACK_TO_MOVE: Hash = 64934999470316615; + +static EN_PASSANT_HASHES: EnPassantHashesType = [ + 15459456780870779090, + 13715484424881807779, + 17718572936700675021, + 14587996314750246637, + 6677028061025754322, + 13431580652429297681, + 10925346160689749684, + 14880644562654141744, +]; + +static CASTLING_HASHES: CastlingHashesType = [ + [ + 1045274958981515586, + 5392148996167941106, + 14319713487061152634, + 15981422700840256970, + ], + [ + 11438431953559128973, + 15165640837126078406, + 9682374909294934964, + 3746638112738371362, + ], + [ + 13000030342210934332, + 12451924122435870810, + 1313989399406774579, + 3743948554594595520, + ], + [ + 1870378950492858291, + 9613620781770901799, + 1269273018318959782, + 13819231333457059, + ], +]; + +static PIECE_HASHES: PieceHashesType = [ + [ + [ + 15846310122511714997, + 15565321750356536561, + 3955109975630601799, + 3742215252323203816, + 11547754013648268969, + 9179750610831012912, + 10024580902115404844, + 13461155397890310677, + 3979252975486053221, + 6862564799914328471, + 15012810188093697577, + 14104378448227943386, + 2251111072992350966, + 8718770409981886807, + 11590981376022443418, + 9179472875549373335, + 14751486135220696139, + 14770349609267618816, + 15794210789350854238, + 8074262070310026138, + 9807231349326167510, + 17878059168006197756, + 17020217056933277306, + 8168773538726665343, + 10540649568352071500, + 16427391340497996472, + 12836595115039890498, + 13099644563326246186, + 15638621634497942258, + 2470341953153926693, + 17228296995745787514, + 12051949271418111299, + 6735994487591330742, + 9945519289001331203, + 8761273995014635795, + 1134254747965098098, + 149908616240508937, + 947996201587548444, + 10050792753492913065, + 6389723739863027484, + 4054114923002827406, + 12342721822805852545, + 5603619551769484817, + 1502519545082924996, + 6629729157787095604, + 6505804100374502042, + 6551044912839567696, + 17519353744604830596, + 18262046566844392781, + 8444802205465859643, + 12318372284896528480, + 16384512768777965260, + 13872119029325166208, + 551553250648480702, + 12194494366773487659, + 8903817316641024797, + 2856044415979638552, + 17626060259890197188, + 6204959673627423824, + 1196712911958154145, + 2299761267346255152, + 13890713223244418265, + 13545009731095633715, + 5588589786121212040, + ], + [ + 13394976401688450359, + 13458262092976265526, + 6458425333551298230, + 16068454197931831293, + 18115196974811588644, + 1945822552233231513, + 18242988029158079236, + 3508136533350863061, + 9221855519679203686, + 3417028073401167173, + 13676868907893858811, + 7891128041711130824, + 4438008134626964309, + 828375571561672767, + 5211525107864059583, + 9951912569669194338, + 15797222372094286515, + 8031369593312222855, + 8459483884800911883, + 16250516697391580568, + 9104850039807961769, + 9638459339574322133, + 7406414063314534801, + 16587044842087257956, + 4325976508659744589, + 3356271001861605262, + 11946543884567451524, + 2812959899045266534, + 9351004795482833123, + 12853162644250497974, + 15431128269247189177, + 5991459945115953374, + 10350914579691276699, + 317376031773017443, + 3618864447183195700, + 16484606785691860878, + 9692191468962987334, + 37863413628624730, + 16923022336523863681, + 5326304323994646307, + 2428164027580304344, + 10876721990417417330, + 420071405568015327, + 15896189023987324028, + 7501421402327487769, + 14082520727391598306, + 11398443591517781683, + 11126740362224499141, + 6822215190080389784, + 14824879461080717187, + 10688928270409693617, + 13901361354457603851, + 250990532055096151, + 217795811433087721, + 11496704042595325298, + 12623825688587535239, + 6447866609161442272, + 11475096638962239574, + 13961623773416109785, + 4105307170473648810, + 3973243685325579613, + 9494401018484929627, + 20006943945916687, + 11903697614114951560, + ], + [ + 3690587531763593363, + 13885624810608316834, + 5607624542457669773, + 12135564358801855460, + 4446836951225686915, + 12472483031571860689, + 2736997872307808559, + 118674841525456732, + 17193145968198975121, + 7969033855049787458, + 5737495496259253001, + 1897399075984783518, + 12789381638949760189, + 8113504179765797443, + 595432870435327398, + 3476852355417867968, + 8280596186023326035, + 7031315074821615754, + 15130713716303029382, + 14738515924140621785, + 16823656838416817865, + 11512745403171831959, + 9713600364975496703, + 8076259513948145927, + 14467669620925674481, + 158730839338002039, + 1802592438558145119, + 9363119952329021091, + 105967970713505430, + 15995787761535739532, + 1909056520202569570, + 3849657788135620047, + 1433706242814734002, + 2512105352812598672, + 2887501559413438146, + 15210005340970705953, + 10881040147030968516, + 7578876291932537631, + 12227032199200032249, + 5720045455042277852, + 17400393972124160940, + 13968348826696289700, + 4691947163184896321, + 14382862859392087454, + 1273370694834677574, + 2097899237423795441, + 15051632852246180430, + 16165677388051025154, + 2535027998345740898, + 6612021553031301778, + 4872500892936395322, + 9213127058723692479, + 16637311583034884253, + 17157822031284380900, + 1657922974346786987, + 11175106282670399340, + 15892468403830849290, + 4101255317824574327, + 14501119344146015188, + 3420256760684759966, + 430472134306562862, + 2337444395187388666, + 13599329138906238118, + 17668204307700984669, + ], + [ + 1767472920679339057, + 14082936559468749559, + 1413880663326372116, + 10705367841426333649, + 5537470338015349051, + 12866924289831421291, + 4428751101812181690, + 2699958690904306254, + 18213591554206267200, + 8527893759735728323, + 7172880010449874732, + 12672600755971214662, + 12210003153898278039, + 8555607754266391982, + 14398998151357989081, + 858080552587592614, + 15504853585397258680, + 6220555144450628459, + 10305515006459536590, + 14891452017879003363, + 18050619291989201021, + 11373790071747978079, + 18201773829943487338, + 10437978645586997949, + 12849819919940976821, + 4483246683417136815, + 15846903660579554392, + 1018784135202123164, + 6911185105132183235, + 11619014052459059223, + 8818501332496366977, + 15546893450170930577, + 16950209698165104902, + 4116125396588831597, + 188473686990703848, + 18187207258885063840, + 16363818859628459401, + 8743990205247337841, + 10488087234691240397, + 5651938883350096610, + 15924019588565743041, + 11136159581173086291, + 17934822160030264765, + 5061298994379818785, + 195369924570726370, + 17050832301390611091, + 22725132194490493, + 15556414533079398843, + 3990573830772882378, + 3360169762087184725, + 689245566469322678, + 8931066757019732136, + 7719317277364154882, + 226304218713923770, + 4943374134151180893, + 13731300347285222865, + 301214310880715317, + 389377574110938037, + 14173618363053396331, + 3431181573289799396, + 13770322358880719908, + 14755876294387681197, + 1810194810765833667, + 10108745010013199269, + ], + [ + 7764062839457162437, + 11741759478077697033, + 8651354243877205790, + 15429384648560453166, + 4282651702327747008, + 16871187978641026815, + 6820994512466779277, + 18158156566427459046, + 4508524102950979090, + 16396223406243106025, + 11240522534199142118, + 792740089807455455, + 15550355798864849911, + 11686348911904530676, + 6040771785522271236, + 13488759770116750509, + 4731594914694946817, + 1040231234387996200, + 8849499839857637945, + 2413055014148664122, + 13867290405531250176, + 14362190972884924003, + 17305062087483598891, + 1748847742159412754, + 8133811204974116306, + 12083718907601203988, + 7014018663613897084, + 2014092656610274856, + 2743298157667671447, + 11643732090855831635, + 11250851525006141623, + 2936428779704708301, + 11393067578885422743, + 8724015120353455274, + 13705068541601393894, + 7528131639007409723, + 15141613737485729718, + 3385537796990715435, + 6570183427959510278, + 12751050629918821094, + 7646275094027983157, + 8277005368415815292, + 7546636328154591228, + 15648771470751997165, + 13982129828433177322, + 10180436254617215165, + 392996715048618277, + 13232777498271787105, + 7055760385863776354, + 13254342896708451569, + 8560140581582040378, + 107109168603320886, + 18230858113827520737, + 5282414160039311498, + 7529636915621456382, + 15616347824638058603, + 11147296505326367251, + 542673254595523470, + 16954422334495305532, + 11364052937546887148, + 2888990270943122866, + 18091936069917916498, + 6281124045212188877, + 8593493261528980987, + ], + [ + 2989769720598162601, + 9106605827001636129, + 9570364881960985889, + 12902387062392871952, + 6239306021096882609, + 193926176087719705, + 6039110239366139997, + 15976034333201272181, + 1284657161207483125, + 4529520247997302077, + 12880558114497078927, + 6431387664297095305, + 15752238407942406005, + 7882692850296881944, + 8729163884851061539, + 14047483969824405122, + 17478776223161311773, + 16826998636345075644, + 5858086577301950025, + 2636153573532075124, + 17699473427841256248, + 1799999873579346924, + 17566984640879707528, + 13988132095580126052, + 7619590186098772590, + 618624160438839140, + 12219561462441938361, + 7148930398504884567, + 12422992075996304722, + 13118697411912473096, + 13367073180995828371, + 10610114944822631745, + 12078360036519044653, + 17421137131317266064, + 1615990355538785141, + 10376900783894145643, + 7488144083843255003, + 7517365090928813948, + 321937459601209105, + 10902930400532188781, + 16291893235893524057, + 9427884403524285839, + 13578219403996237208, + 7806344414248555555, + 1590178323452864480, + 4502737751334025566, + 14708705959315399774, + 17590011802110929593, + 8011063244042503593, + 3372062355514862432, + 7956604703943654557, + 7231568622761101113, + 3263790014618620510, + 5386114617935898764, + 17264930726535012718, + 17080979445745211883, + 16389446497941026493, + 1251555922590127803, + 1766319409423742345, + 5824933421221698593, + 8025838020465500614, + 1712486214309232600, + 2515668779116428348, + 5226880572965474519, + ], + ], + [ + [ + 8784996223880854135, + 8383322499467679771, + 11940829602286487528, + 749107577493620337, + 11658422359938522809, + 4437497841247955656, + 15039671436672630417, + 4428360460268361808, + 2612794400702075079, + 15154659025882080833, + 5966000488771745326, + 4682695811674311589, + 12399365904562251200, + 5743563134163369275, + 13725569263199228994, + 7820192892738641522, + 6725918893915352363, + 7238103260086822739, + 2419261908419519043, + 1944371521922958171, + 2030558929543619751, + 3154111065943957722, + 4897988930870536672, + 1998798151709288163, + 8648130913002646752, + 14934102049464497415, + 14890708649339335861, + 5049764018185114710, + 6628788106932185325, + 7112428968720217947, + 768481401627884428, + 6927893648564764526, + 14824457410356736781, + 4919540991021201863, + 17657853678445794877, + 2455519753056386028, + 16172661961128836972, + 12167841863002121500, + 13316779136479539099, + 18284102055623331862, + 17589865849446474652, + 6717797920114441655, + 15524331207306797155, + 17070876216372501673, + 1954875790784141799, + 10645093897317790329, + 4708222068247433732, + 4356248055106363889, + 10404059695057428683, + 13035281567593499713, + 8349335668474539561, + 3990743337244382716, + 14952065725070842007, + 6950645437249564545, + 5652844207558347571, + 6281201628596327010, + 10838601833556911887, + 3078232460409103108, + 16757569558796272077, + 13517006479681764308, + 3967782207298453705, + 2714491513812003904, + 3317235162126665239, + 10226456545359395820, + ], + [ + 14251164629646129355, + 14998010409278028449, + 15542716158726314377, + 15397369278605634912, + 6100939107550711871, + 8713557161650028897, + 7089200899188634784, + 18063407508254720661, + 4337632717401767199, + 412125615877358058, + 6028165109585501223, + 15363085808083465317, + 14613845430069397737, + 14144649511022558651, + 8723888308700229883, + 14293487351767918335, + 9715937204640118456, + 11580361794788080335, + 915367859885060415, + 6459021974772294395, + 12060251587777088927, + 5532704576266363546, + 14489993909470049835, + 16426177833267107097, + 3607428550576839172, + 7438257254616020826, + 1396656355772112991, + 8608813051183737928, + 16492817754651347629, + 17881274662026570031, + 2300492472172319558, + 4404464307798321562, + 673784220717200369, + 821776834022136343, + 9919609767573651109, + 683748932020981069, + 8525746577539403297, + 6457801651776444340, + 9646366338259658387, + 13892539345304574027, + 17083943815740411827, + 14429863601822528150, + 12168108271452973589, + 7112427582244629105, + 15323648062786793762, + 17973045586494826124, + 12929297255917642880, + 7541633487917495391, + 16210663046879785083, + 6910370472905777769, + 8343768604822167659, + 3485907538729594342, + 7103934160758964305, + 4901126205516980066, + 314770954154071230, + 13789286550919187294, + 17135937634126147737, + 17711186974010444553, + 3583060176114895621, + 12984377250840503307, + 9001292467502639703, + 5302703806177083024, + 11829855060898447362, + 7792871150005700771, + ], + [ + 1520093331355966943, + 14776253866741286711, + 1830435902514789447, + 6783716807773264245, + 7030091404042309875, + 1720223441255340701, + 13445382365734258737, + 11449213796602164673, + 10874370555683857320, + 18246047722161781849, + 492037621672777879, + 16532473357347977151, + 5888002492723757072, + 11847570994151287255, + 14050715334936968126, + 5448278994699028448, + 5062909158550936849, + 11465405229960447949, + 2779995984806079730, + 8108449415663851271, + 5925771076410909364, + 4398525992925930953, + 15105632689435380115, + 8224881353639377989, + 13142137441375466514, + 402244963327403059, + 15972426265038828054, + 14918608839495061965, + 4783523652206804079, + 5533802637901392118, + 15857468142361536438, + 483935465300448184, + 17547570023467671419, + 9118083899124499413, + 16067662280423557207, + 14860481864823305290, + 12544461391667452601, + 16479998523741582369, + 2004653907916258288, + 10016134492966295503, + 14654098897665700345, + 15597902928417621210, + 17875771155388593350, + 12187680377949566458, + 6591854158971319321, + 10921345154959883977, + 6992586914959052076, + 6881186710214967907, + 10133687459128153147, + 11053978924568326706, + 13937927219834850327, + 3101883468469491331, + 8427212063981998124, + 2092323926080990908, + 3585817315360256386, + 15747726726131045899, + 16440560833072674588, + 18384346789732354577, + 16783457322743335580, + 11756627869063466658, + 11167824433661290940, + 9877633665654560039, + 17040076472624122335, + 3220010953426300691, + ], + [ + 2440551681152908217, + 17542921143062722953, + 11172685451694101778, + 1048396501496535768, + 6426140309273374561, + 12612852760901936331, + 1512574622848540746, + 12173187909250955505, + 2022797643158268462, + 11997025710748266437, + 7697722427032893513, + 3131801314231591172, + 16260489484426716331, + 4160620514044135000, + 2020718294955480764, + 3402776113237843614, + 1763635255903222910, + 1493348699626208256, + 11968167413422708151, + 345811979331432929, + 6373077428271171816, + 2460378116234706383, + 7628144846272841726, + 13325719783294577659, + 14728551694622182478, + 3801351080956315294, + 14893478564914456114, + 6842729530296982472, + 7092303763023731054, + 13253731529913205555, + 12120103223599095759, + 13535231015523935415, + 10292012323401205180, + 1773004715998349698, + 16799776551041782060, + 10929981434226220413, + 5672227401526069291, + 15197185234723998232, + 2327868618089768447, + 11691196257790359528, + 7797108122232849111, + 17247378053385545795, + 17190992283359664342, + 11765180081852900764, + 17136020481758062916, + 16631142675265592717, + 2780308612474172011, + 13623309349488327240, + 10027477427374497277, + 10901098973779551879, + 13622367348979020321, + 17240066494945993895, + 3613111118313098801, + 3595718136710251489, + 15541177346768674456, + 2745954478213783820, + 2993333600340807291, + 7964104343962539977, + 2018911365155885783, + 303730231039108799, + 8347454704269268605, + 15168982392769178779, + 2222543894286897630, + 7116612461922271036, + ], + [ + 6659924125020249146, + 6447320752673406213, + 9967928188577790738, + 13067246238653248617, + 17543091787100809270, + 8900021509039330195, + 17145380139140011656, + 8400586664049469607, + 10795739003701585879, + 15466110299051417899, + 12359481046676402302, + 7116524366403677718, + 16169260265445853433, + 8692955756594060325, + 16615201418588912179, + 13173840077278718451, + 11541289024103137321, + 6319485103686695464, + 17758367064472002749, + 13554787615980332253, + 11638126900518821099, + 13954358659690479765, + 9973591566221607183, + 17163362073809978216, + 18303884563040881112, + 17405285323670017057, + 342959662696107471, + 1347610445893916230, + 5966782602002155351, + 7019395552225934922, + 5023307274424494080, + 14877119153064003138, + 12713062183167165488, + 3300175320814166235, + 12719695066185815582, + 15494003269637617920, + 12471806264411606594, + 689503650964098331, + 13045361994561212689, + 6792032840206349333, + 8564825371269942766, + 11860222023510411541, + 8263360838969018477, + 4621300043926690155, + 4911502441925492974, + 5810422953738103400, + 11263635798182361717, + 9404485481139860053, + 15617136572270427657, + 2446567841402084273, + 8338408414503449551, + 15353996633614181426, + 4523550137711543282, + 12457522381881075539, + 4092390258313244045, + 3708028013704908406, + 16685460470125872576, + 16440216368869048512, + 12879711695951990697, + 4790961591497355085, + 8914134962745961064, + 15580015213313907777, + 8644499442940218319, + 61217168966658081, + ], + [ + 2912759343743843999, + 14884813698979495195, + 16425233319897104847, + 14688503175962192854, + 16633510544151871827, + 712664039270274475, + 585745436804207639, + 7392141637871392475, + 18381405436219133756, + 14689295466480430970, + 9306876723096610361, + 12658459328140256364, + 3007342023158025032, + 4037157658642530533, + 8009151754207580377, + 4847981282259436185, + 1433660584766270169, + 5274091252087296014, + 13330399601366117612, + 16588395809568307079, + 14448566552430231758, + 13343329601558313195, + 12158146930071854376, + 4197885034159347546, + 3445100139072421635, + 16609318396120447823, + 6042075030399342756, + 13793584353850054662, + 16021579771298913846, + 11054052814289128888, + 16074104597928497109, + 15130554541552071802, + 4895805849687331062, + 1580544981451361794, + 2425277209291829232, + 7864782989239724936, + 17589104864303907651, + 15274489251065018408, + 5101250638773604988, + 2484123793698223520, + 5015053599434799784, + 16436209554247109768, + 10530941408166861910, + 7952403580920522728, + 14690149799888783296, + 3789888246444727158, + 18109247358095710450, + 3088677810223885810, + 5022612625499977309, + 7112612464628965285, + 4566226729227242637, + 5042221516346092028, + 16846599512836514536, + 6256199833536459738, + 2014937527629117588, + 17739428229013858448, + 13982298082608600032, + 17248258267345510543, + 18214829730500207223, + 7600462139109877437, + 6812119576048580698, + 6424206435528040580, + 487857718885957481, + 13371986807426798615, + ], + ], +]; +// endregion:sourcegen }}} + +/// Return the Zobrist hash for a [Piece] of a given [Color] on a given [Square]. +pub fn moved_piece(color: Color, piece: Piece, square: Square) -> Hash { + PIECE_HASHES[color.index()][piece.index()][square.index()] +} + +/// Return the Zobrist hash for the [CastleRights] for a [Color]. +pub fn castling_rights(rights: [CastleRights; Color::NUM_VARIANTS]) -> Hash { + CASTLING_HASHES[rights[0].index()][rights[1].index()] +} + +/// Return the Zobrist hash for the [File] of an en-passant capture. +pub fn en_passant(file: File) -> Hash { + EN_PASSANT_HASHES[file.index()] +} + +/// Return the Zobrist hash for the given side-to-move being [Color::Black]. +pub fn side_to_move() -> Hash { + BLACK_TO_MOVE +} + +#[cfg(test)] +mod test { + use std::fmt::{Display, Write as _}; + + use super::*; + use crate::utils::SimpleRng; + + fn split_twice<'a>( + text: &'a str, + start_marker: &str, + end_marker: &str, + ) -> Option<(&'a str, &'a str, &'a str)> { + let (prefix, rest) = text.split_once(start_marker)?; + let (mid, suffix) = rest.split_once(end_marker)?; + Some((prefix, mid, suffix)) + } + + fn array_string(indent_level: usize, values: &[T]) -> String { + let inner = || -> Result { + let mut res = String::new(); + + writeln!(&mut res, "[")?; + for val in values { + let indent = (indent_level + 1) * 4; + writeln!(&mut res, "{:indent$}{},", "", val)?; + } + let indent = indent_level * 4; + write!(&mut res, "{:indent$}]", "")?; + + Ok(res) + }; + + inner().unwrap() + } + + #[test] + fn regen_zobrist_hashes() { + let mut rng = SimpleRng::new(); + + macro_rules! rng_iter { + ($outer:expr, $( $inner:expr ),+) => {{ + let mut res = vec![]; + for _ in $outer { + res.push(rng_iter!($($inner),+)); + } + res + }}; + ($iter:expr) => {{ + let mut res = vec![]; + for _ in $iter { + res.push(rng.gen()); + } + res + }}; + } + + let black_to_move = rng.gen(); + let en_passant = rng_iter!(File::iter()); + let castle_rights = rng_iter!(CastleRights::iter(), CastleRights::iter()); + let move_piece = rng_iter!(Color::iter(), Piece::iter(), Square::iter()); + + let original_text = std::fs::read_to_string(file!()).unwrap(); + let new_text = { + let start_marker = "// region:sourcegen {{{\n"; + let end_marker = "// endregion:sourcegen }}}\n"; + let (prefix, _, suffix) = + split_twice(&original_text, start_marker, end_marker).unwrap(); + + let black_to_move = format!("static BLACK_TO_MOVE: Hash = {};\n", black_to_move); + let en_passant = format!( + "static EN_PASSANT_HASHES: EnPassantHashesType = {};\n", + array_string(0, &en_passant[..]), + ); + let castle_rights = { + let strings: Vec<_> = castle_rights + .iter() + .map(|v| array_string(1, &v[..])) + .collect(); + format!( + "static CASTLING_HASHES: CastlingHashesType = {};\n", + array_string(0, &strings[..]) + ) + }; + let move_piece = { + let strings: Vec<_> = move_piece + .iter() + .map(|v| { + let strings: Vec<_> = v.iter().map(|v| array_string(2, &v[..])).collect(); + array_string(1, &strings[..]) + }) + .collect(); + format!( + "static PIECE_HASHES: PieceHashesType = {};\n", + array_string(0, &strings[..]) + ) + }; + let hashes = format!("{black_to_move}\n{en_passant}\n{castle_rights}\n{move_piece}"); + format!("{prefix}{start_marker}{hashes}{end_marker}{suffix}") + }; + + if new_text != original_text { + std::fs::write(file!(), new_text).unwrap(); + panic!("source was not up-to-date") + } + } +}