)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":1003698,"name":"Brant Burnett","email":"bburnett@centeredgesoftware.com","username":"brantburnett","avatars":[{"url":"https://www.gravatar.com/avatar/12aa2d70cf0b92feeceb6dd7f81dd059.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/12aa2d70cf0b92feeceb6dd7f81dd059.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/12aa2d70cf0b92feeceb6dd7f81dd059.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/12aa2d70cf0b92feeceb6dd7f81dd059.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"cc5d9344d384ccd8b2faee11eaefb8bd6da73b2e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"7ee44a22_498f4b6a","updated":"2024-11-17 13:49:11.000000000","message":"Ready for review. Has some pretty significant performance gains.","commit_id":"36a8ef81393edb88a3d33a606a4ad1af4502ad50"}],"src/Couchbase/Core/IO/Operations/Observe.cs":[{"author":{"_account_id":1005037,"name":"Emilien Bevierre","email":"emilien.bevierre@couchbase.com","username":"SecureCake","avatars":[{"url":"https://www.gravatar.com/avatar/c1e3f0606531d9492a433378ebb72350.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/c1e3f0606531d9492a433378ebb72350.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/c1e3f0606531d9492a433378ebb72350.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/c1e3f0606531d9492a433378ebb72350.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"9baebeafd9cea9479f7c32eb662f7498259b1753","unresolved":true,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"        protected override void WriteBody(OperationBuilder builder)"},{"line_number":23,"context_line":"        {"},{"line_number":24,"context_line":"            const int vBucketAndLengthSize \u003d sizeof(ushort) * 2;"},{"line_number":25,"context_line":"            var buffer \u003d builder.GetSpan(vBucketAndLengthSize + OperationHeader.MaxKeyLength + Leb128.MaxLength);"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"            var keyLength \u003d WriteKey(buffer.Slice(vBucketAndLengthSize));"}],"source_content_type":"text/x-csharp","patch_set":10,"id":"09090231_bfbc1553","line":24,"range":{"start_line":24,"start_character":12,"end_line":24,"end_character":64},"updated":"2025-05-15 13:55:43.000000000","message":"I like it but just in case I\u0027m missing something else, `vBucketAndLengthSize \u003d sizeof(ushort) * 2` is just to make it visually clear why we\u0027re allocating `4` right?","commit_id":"462aafcb77f7da9197bf3eefabc48d887b853a0d"},{"author":{"_account_id":1003698,"name":"Brant Burnett","email":"bburnett@centeredgesoftware.com","username":"brantburnett","avatars":[{"url":"https://www.gravatar.com/avatar/12aa2d70cf0b92feeceb6dd7f81dd059.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/12aa2d70cf0b92feeceb6dd7f81dd059.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/12aa2d70cf0b92feeceb6dd7f81dd059.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/12aa2d70cf0b92feeceb6dd7f81dd059.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"711f2f2e24933ae26494f3f54e25dd2258e38137","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"        protected override void WriteBody(OperationBuilder builder)"},{"line_number":23,"context_line":"        {"},{"line_number":24,"context_line":"            const int vBucketAndLengthSize \u003d sizeof(ushort) * 2;"},{"line_number":25,"context_line":"            var buffer \u003d builder.GetSpan(vBucketAndLengthSize + OperationHeader.MaxKeyLength + Leb128.MaxLength);"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"            var keyLength \u003d WriteKey(buffer.Slice(vBucketAndLengthSize));"}],"source_content_type":"text/x-csharp","patch_set":10,"id":"c61d41e1_585cea81","line":24,"range":{"start_line":24,"start_character":12,"end_line":24,"end_character":64},"in_reply_to":"09090231_bfbc1553","updated":"2025-05-15 15:12:46.000000000","message":"Yes, and since the compiler collapses it to 4 it\u0027s equivalent but clearer.","commit_id":"462aafcb77f7da9197bf3eefabc48d887b853a0d"}],"src/Couchbase/Core/IO/Operations/OperationBuilder.cs":[{"author":{"_account_id":1005037,"name":"Emilien Bevierre","email":"emilien.bevierre@couchbase.com","username":"SecureCake","avatars":[{"url":"https://www.gravatar.com/avatar/c1e3f0606531d9492a433378ebb72350.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/c1e3f0606531d9492a433378ebb72350.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/c1e3f0606531d9492a433378ebb72350.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/c1e3f0606531d9492a433378ebb72350.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"9baebeafd9cea9479f7c32eb662f7498259b1753","unresolved":true,"context_lines":[{"line_number":532,"context_line":"            Debug.Assert(_buffer.Length \u003e\u003d capacity);"},{"line_number":533,"context_line":"        }"},{"line_number":534,"context_line":""},{"line_number":535,"context_line":"        private static int GetSameOrNextPowerOfTwo(int value)"},{"line_number":536,"context_line":"        {"},{"line_number":537,"context_line":"            Debug.Assert(value \u003e 0);"},{"line_number":538,"context_line":""},{"line_number":539,"context_line":"            // Reduce by 1 so that if value is already a power of two the result is value"},{"line_number":540,"context_line":"            // One becomes zero which both have the same result below of 1"},{"line_number":541,"context_line":"            value--;"},{"line_number":542,"context_line":""},{"line_number":543,"context_line":"            // Floor(Log2(n)) returns the index of the most significant non-zero bit"},{"line_number":544,"context_line":"#if NET6_0_OR_GREATER"},{"line_number":545,"context_line":"            var floorLog2 \u003d BitOperations.Log2((uint) value);"},{"line_number":546,"context_line":"#else"},{"line_number":547,"context_line":"            var floorLog2 \u003d Log2SoftwareFallback((uint) value);"},{"line_number":548,"context_line":"#endif"},{"line_number":549,"context_line":""},{"line_number":550,"context_line":"            // Setting the next highest bit will be the next power of 2"},{"line_number":551,"context_line":"            return 1 \u003c\u003c (floorLog2 + 1);"},{"line_number":552,"context_line":"        }"},{"line_number":553,"context_line":""},{"line_number":554,"context_line":"#if !NET6_0_OR_GREATER"},{"line_number":555,"context_line":"        // Port from .NET 7 BitOperations of a faster fallback algorithm for .NET Standard since we don\u0027t have intrinsics"}],"source_content_type":"text/x-csharp","patch_set":10,"id":"fd18f246_2493e45d","line":552,"range":{"start_line":535,"start_character":8,"end_line":552,"end_character":9},"updated":"2025-05-15 13:55:43.000000000","message":"Just out of curiosity would `ArrayPool\u003cbyte\u003e.Shared.Rent()` not try to optimise requested memory length with something similar to this? \nIs it always optimal to calculate the power of 2 that can fit the requested memory length?","commit_id":"462aafcb77f7da9197bf3eefabc48d887b853a0d"},{"author":{"_account_id":1003698,"name":"Brant Burnett","email":"bburnett@centeredgesoftware.com","username":"brantburnett","avatars":[{"url":"https://www.gravatar.com/avatar/12aa2d70cf0b92feeceb6dd7f81dd059.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/12aa2d70cf0b92feeceb6dd7f81dd059.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/12aa2d70cf0b92feeceb6dd7f81dd059.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/12aa2d70cf0b92feeceb6dd7f81dd059.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"711f2f2e24933ae26494f3f54e25dd2258e38137","unresolved":false,"context_lines":[{"line_number":532,"context_line":"            Debug.Assert(_buffer.Length \u003e\u003d capacity);"},{"line_number":533,"context_line":"        }"},{"line_number":534,"context_line":""},{"line_number":535,"context_line":"        private static int GetSameOrNextPowerOfTwo(int value)"},{"line_number":536,"context_line":"        {"},{"line_number":537,"context_line":"            Debug.Assert(value \u003e 0);"},{"line_number":538,"context_line":""},{"line_number":539,"context_line":"            // Reduce by 1 so that if value is already a power of two the result is value"},{"line_number":540,"context_line":"            // One becomes zero which both have the same result below of 1"},{"line_number":541,"context_line":"            value--;"},{"line_number":542,"context_line":""},{"line_number":543,"context_line":"            // Floor(Log2(n)) returns the index of the most significant non-zero bit"},{"line_number":544,"context_line":"#if NET6_0_OR_GREATER"},{"line_number":545,"context_line":"            var floorLog2 \u003d BitOperations.Log2((uint) value);"},{"line_number":546,"context_line":"#else"},{"line_number":547,"context_line":"            var floorLog2 \u003d Log2SoftwareFallback((uint) value);"},{"line_number":548,"context_line":"#endif"},{"line_number":549,"context_line":""},{"line_number":550,"context_line":"            // Setting the next highest bit will be the next power of 2"},{"line_number":551,"context_line":"            return 1 \u003c\u003c (floorLog2 + 1);"},{"line_number":552,"context_line":"        }"},{"line_number":553,"context_line":""},{"line_number":554,"context_line":"#if !NET6_0_OR_GREATER"},{"line_number":555,"context_line":"        // Port from .NET 7 BitOperations of a faster fallback algorithm for .NET Standard since we don\u0027t have intrinsics"}],"source_content_type":"text/x-csharp","patch_set":10,"id":"a51328b6_9315482f","line":552,"range":{"start_line":535,"start_character":8,"end_line":552,"end_character":9},"in_reply_to":"fd18f246_2493e45d","updated":"2025-05-15 15:12:46.000000000","message":"You\u0027re right, I was overthinking this part, I\u0027ve simplified the code now. I left the unit tests in place since they\u0027ll catch it if the internal implementation of ArrayPool\u003cT\u003e.Shared is ever changed.","commit_id":"462aafcb77f7da9197bf3eefabc48d887b853a0d"}]}
