1<?php
2
3/**
4 * This file is part of the ramsey/uuid library
5 *
6 * For the full copyright and license information, please view the LICENSE
7 * file that was distributed with this source code.
8 *
9 * @copyright Copyright (c) Ben Ramsey <ben@benramsey.com>
10 * @license http://opensource.org/licenses/MIT MIT
11 */
12
13declare(strict_types=1);
14
15namespace Ramsey\Uuid;
16
17/**
18 * Provides binary math utilities
19 */
20class BinaryUtils
21{
22    /**
23     * Applies the RFC 4122 variant field to the 16-bit clock sequence
24     *
25     * @link http://tools.ietf.org/html/rfc4122#section-4.1.1 RFC 4122, § 4.1.1: Variant
26     *
27     * @param int $clockSeq The 16-bit clock sequence value before the RFC 4122
28     *     variant is applied
29     *
30     * @return int The 16-bit clock sequence multiplexed with the UUID variant
31     *
32     * @psalm-pure
33     */
34    public static function applyVariant(int $clockSeq): int
35    {
36        $clockSeq = $clockSeq & 0x3fff;
37        $clockSeq |= 0x8000;
38
39        return $clockSeq;
40    }
41
42    /**
43     * Applies the RFC 4122 version number to the 16-bit `time_hi_and_version` field
44     *
45     * @link http://tools.ietf.org/html/rfc4122#section-4.1.3 RFC 4122, § 4.1.3: Version
46     *
47     * @param int $timeHi The value of the 16-bit `time_hi_and_version` field
48     *     before the RFC 4122 version is applied
49     * @param int $version The RFC 4122 version to apply to the `time_hi` field
50     *
51     * @return int The 16-bit time_hi field of the timestamp multiplexed with
52     *     the UUID version number
53     *
54     * @psalm-pure
55     */
56    public static function applyVersion(int $timeHi, int $version): int
57    {
58        $timeHi = $timeHi & 0x0fff;
59        $timeHi |= $version << 12;
60
61        return $timeHi;
62    }
63}
64