Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:128648 X-Original-To: internals@lists.php.net Delivered-To: internals@lists.php.net Received: from php-smtp4.php.net (php-smtp4.php.net [45.112.84.5]) by lists.php.net (Postfix) with ESMTPS id 8433E1A00BC for ; Sat, 6 Sep 2025 11:48:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=php.net; s=mail; t=1757159216; bh=u6OIBkYMWMmcVM0ULEFj1gE0WyDDkpRxXEiGtXM+jn0=; h=Date:From:To:Subject:In-Reply-To:References:From; b=lVQOU2C2W6/m53QvWhpXNH95UjboNRC37uxg9xHj8Qwb8gC4pPLs6ee/ldNek+j96 mfhN2Vy2LO0GkT0qLtER+YswmiZVlPk6bc3F4QbSqw1blB7jX2LwNv1gbJjjPrAm6O ylWGlZF+dNt8OjkE6hLygIu+IStkhrb08wueyJyVsvpKaAcfURywo9u1HRKGVdeORv 0dpvxeqdzcrpOfIkkCmG0sCYg8vbkr5K1VJx10P/ePkDfY5Ja3V6LThppzXx/GD5AN poowur06HhL/xAFcYbA0lERI1MqVubBChVyobYWMsvE78fUsK0gG6YKMAAfgCrP1By Ei2IRFIQdAE0Q== Received: from php-smtp4.php.net (localhost [127.0.0.1]) by php-smtp4.php.net (Postfix) with ESMTP id D427918003F for ; Sat, 6 Sep 2025 11:46:55 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on php-smtp4.php.net X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=BAYES_20,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,DMARC_MISSING,RCVD_IN_DNSWL_LOW, SPF_HELO_PASS,SPF_PASS autolearn=no autolearn_force=no version=4.0.1 X-Spam-Virus: No X-Envelope-From: Received: from fout-b1-smtp.messagingengine.com (fout-b1-smtp.messagingengine.com [202.12.124.144]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by php-smtp4.php.net (Postfix) with ESMTPS for ; Sat, 6 Sep 2025 11:46:55 +0000 (UTC) Received: from phl-compute-06.internal (phl-compute-06.internal [10.202.2.46]) by mailfout.stl.internal (Postfix) with ESMTP id 13A101D002C4 for ; Sat, 6 Sep 2025 07:48:23 -0400 (EDT) Received: from phl-mailfrontend-01 ([10.202.2.162]) by phl-compute-06.internal (MEProxy); Sat, 06 Sep 2025 07:48:23 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rwec.co.uk; h=cc :content-transfer-encoding:content-type:content-type:date:date :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to; s=fm1; t=1757159302; x=1757245702; bh=SRAjxa7LWCbXzbhW2s8eOFEqGVVhGYCJ7x5QECFTt4I=; b= cK6RCkuHSKRjM40rX9QhQxRCd7mYiHDlAvhD0CN5/VxYwrYBauAllHeQvDFYSUQy jZnJjVO9GPV9yLKQnIOFhpXaBenM+tFQEnsVscVt1vMuGjw2fwsqL/B9rpq3tF9r Li/NttgmVcPyvAAuGCIwsOqJDjmyK0HntDncAbaws+v2r+ki3ljos5/V5chZf48h oQ4J+2YEcHw3mZzSKrk7yVJIOWwv/cktzzCH/Vaya/07OrdSkcaenM/c4UWq/nAs GF47B8mCHk+S17aiWIygiigb+aXkyELcjE6L+XU+Vbs9u6DIRlhLEpJcWGAua82a xLAvgIJ94vqKJhlQTowxMA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:content-type :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm1; t=1757159302; x=1757245702; bh=S RAjxa7LWCbXzbhW2s8eOFEqGVVhGYCJ7x5QECFTt4I=; b=JYhK/NkwGNj3XMIsJ zeAh7xGaUIgw092BU/S4HZL9zM8OsAyPX8GOI9fgiG4cwsgNqPlBPtqANgrvN9MW kFbSjjlHnhmBaUDWyzqJzNraNKkq5IevWh4k4xez2keH+s5G7wQu73vcIMWvBhK2 kflaO6j1sKHDVQ19ka8OuLmaTjBE5tiYKTTPCRebS+GyktjX9CEqKzSQEOB45qkT WDwBeLtJiuI3+GNsVPNEYlWy1NfyUjZzWy+29ArO2DFNfh2reIsHk2S2ZbxUSRfB LtoJ2LxZn/rbiE8xwlNgSsRKS11lS1yog7XMOPHk9DeZl9Mv3G1jlnc2UwCw6CDW HG8Dg== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdeggdduudeilecutefuodetggdotefrod ftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpuffrtefokffrpgfnqfghnecuuegr ihhlohhuthemuceftddtnecunecujfgurhepfffhvffufggjfhfkgggtgfesthhqmhdttd erjeenucfhrhhomhepfdftohifrghnucfvohhmmhhinhhsucglkffoufhorfgnfdcuoehi mhhsohhprdhphhhpsehrfigvtgdrtghordhukheqnecuggftrfgrthhtvghrnhepheelff etiefgveduteefudegtdduveeludegueegleehiefhhefgtdekveevgfelnecuvehluhhs thgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomhepihhmshhophdrphhhph esrhifvggtrdgtohdruhhkpdhnsggprhgtphhtthhopedupdhmohguvgepshhmthhpohhu thdprhgtphhtthhopehinhhtvghrnhgrlhhssehlihhsthhsrdhphhhprdhnvght X-ME-Proxy: Feedback-ID: id5114917:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA for ; Sat, 6 Sep 2025 07:48:22 -0400 (EDT) Date: Sat, 06 Sep 2025 12:48:19 +0100 To: internals@lists.php.net Subject: Re: [PHP-DEV] enum flag backed enum User-Agent: K-9 Mail for Android In-Reply-To: <366fba57-cbef-4201-9b72-dbafcec0c521@app.fastmail.com> References: <9c875e83-ddc8-4c5c-a368-747bef46e4a2@app.fastmail.com> <25e79d21-7b7f-4d7f-b5cb-1e9cfd0aa657@varteg.nz> <7B9311D1-E433-4DBF-A85D-A7DEA94FCC4C@rwec.co.uk> <366fba57-cbef-4201-9b72-dbafcec0c521@app.fastmail.com> Message-ID: <212EF2C0-0190-4F4A-A040-27DBECB1030F@rwec.co.uk> Precedence: list list-help: list-post: List-Id: x-ms-reactions: disallow MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable From: imsop.php@rwec.co.uk ("Rowan Tommins [IMSoP]") On 6 September 2025 01:47:35 BST, Rob Landers wrote: > >Interesting=2E=2E=2E but we don=E2=80=99t really have a way to say that a= parameter or return value must satisfy *any* constraints except that it be= of a certain type=2E Hmmm, I guess we have "true" and "false" as values th= at can be returned/accepted by functions =E2=80=94 but I think they=E2=80= =99re the only ones=2E Declaring an enum already declares a type=2E I wasn't thinking about const= raining on lists of values, just saying that something should be a "set of = T" where T is the enum type=2E Relying on integer ops, the result ends up as an int: enum FooOption: flag { =2E=2E=2E } class Foo { =2E=2E=2E function setOption(FooOption $opt): void { =2E=2E=2E } function getCurrentOptions(): int { =2E=2E=2E } } With general-purpose generics, you can make that strongly typed: enum FooOption { =2E=2E=2E } class Foo { =2E=2E=2E function setOption(FooOption $opt): void { =2E=2E=2E } function getCurrentOptions(): Set { =2E=2E=2E } } A specific EnumBitSet could implement the integer serialisation: class EnumBitSet extends Set { function asBitMask(): int { =2E=2E=2E } } enum FooOption: int { =2E=2E=2E } class Foo { =2E=2E=2E function setOption(FooOption $opt): void { =2E=2E=2E } function getCurrentOptions(): EnumBitSet { =2E=2E=2E } } $foo =3D new Foo; =2E=2E=2E $foo->getCurrentOptions()->asBitMask(); With the recently proposed declare-time generics, you'd just need an extra= declaration alongside your enum: class EnumBitSet extends Set { function asBitMask(): int { =2E=2E=2E } } enum FooOption: int { =2E=2E=2E } class FooOptionSet extends EnumSet { // Can add additional methods here, but don't need to } class Foo { =2E=2E=2E function setOption(FooOption $opt): void { =2E=2E=2E } function getCurrentOptions(): FooOptionSet { =2E=2E=2E } } $foo =3D new Foo; =2E=2E=2E $foo->getCurrentOptions()->asBitMask(); All the operator overloads or methods for things like intersect, union, co= ntains, etc could be on the top-level Set, since they don't intrinsicall= y have anything to do with enums=2E That's the joy of our enum implementati= on being object-based: any algorithm that works on object identity automati= cally works on enum cases=2E Rowan Tommins [IMSoP]