2
0
Эх сурвалжийг харах

Merge pull request #125 from tsoding/message-limit

Remove message capacity
Alexey Kutepov 5 жил өмнө
parent
commit
1edd72bfe3

+ 66 - 54
src/aids.hpp

@@ -21,7 +21,7 @@
 //
 // ============================================================
 //
-// aids — 0.13.0 — std replacement for C++. Designed to aid developers
+// aids — 0.14.0 — std replacement for C++. Designed to aid developers
 // to a better programming experience.
 //
 // https://github.com/rexim/aids
@@ -30,6 +30,10 @@
 //
 // ChangeLog (https://semver.org/ is implied)
 //
+//   0.14.0 size_t String_View::count_chars(char x) const
+//   0.13.3 Fix control flow in utf8_get_code
+//   0.13.2 Fix magic constant types in utf8_get_code
+//   0.13.1 Remove macros from utf8_get_code implementation
 //   0.13.0 void print1(FILE *stream, unsigned int x)
 //          Maybe<uint32_t> utf8_get_code(String_View view, size_t *size)
 //   0.12.1 Fix print1 and sprint1 bug for unsigned long long
@@ -359,6 +363,17 @@ namespace aids
             return prefix.count <= this->count
                 && this->subview(0, prefix.count) == prefix;
         }
+
+        size_t count_chars(char x) const
+        {
+            size_t result = 0;
+            for (size_t i = 0; i < count; ++i) {
+                if (data[i] == x) {
+                    result += 1;
+                }
+            }
+            return result;
+        }
     };
 
     String_View operator ""_sv(const char *data, size_t count)
@@ -704,59 +719,56 @@ namespace aids
 
     Maybe<uint32_t> utf8_get_code(String_View view, size_t *size)
     {
-#define UTF8_1BYTE_MASK (1 << 7)
-#define UTF8_2BYTES_MASK (1 << 5)
-#define UTF8_3BYTES_MASK (1 << 4)
-#define UTF8_4BYTES_MASK (1 << 3)
-#define UTF8_EXTRA_BYTE_MASK (1 << 6)
-            if (view.count >= 1 &&
-                (*view.data & UTF8_1BYTE_MASK) == 0)
-            {
-                *size = 1;
-                return {true, static_cast<uint32_t>(*view.data)};
-            }
-            if (view.count >= 2 &&
-                (view.data[0] & UTF8_2BYTES_MASK) == 0 &&
-                (view.data[1] & UTF8_EXTRA_BYTE_MASK) == 0)
-            {
-                *size = 2;
-                const auto byte1 = static_cast<uint32_t>((view.data[0] & (UTF8_2BYTES_MASK - 1)) << 6);
-                const auto byte2 = static_cast<uint32_t>(view.data[1] & (UTF8_EXTRA_BYTE_MASK - 1));
-                return {true, byte1 | byte2};
-            }
-            if (view.count >= 3 &&
-                (view.data[0] & UTF8_3BYTES_MASK) == 0 &&
-                (view.data[1] & UTF8_EXTRA_BYTE_MASK) == 0 &&
-                (view.data[2] & UTF8_EXTRA_BYTE_MASK) == 0)
-            {
-                *size = 3;
-                const auto byte1 = static_cast<uint32_t>((view.data[0] & (UTF8_3BYTES_MASK - 1)) << (6 * 2));
-                const auto byte2 = static_cast<uint32_t>((view.data[1] & (UTF8_EXTRA_BYTE_MASK - 1)) << 6);
-                const auto byte3 = static_cast<uint32_t>(view.data[2] & (UTF8_EXTRA_BYTE_MASK - 1));
-                return {true, byte1 | byte2 | byte3};
-            }
-            if (view.count >= 4 &&
-                (view.data[0] & UTF8_4BYTES_MASK) == 0 &&
-                (view.data[1] & UTF8_EXTRA_BYTE_MASK) == 0 &&
-                (view.data[2] & UTF8_EXTRA_BYTE_MASK) == 0 &&
-                (view.data[3] & UTF8_EXTRA_BYTE_MASK) == 0)
-            {
-                *size = 4;
-                const auto byte1 = static_cast<uint32_t>((view.data[0] & (UTF8_3BYTES_MASK - 1)) << (6 * 3));
-                const auto byte2 = static_cast<uint32_t>((view.data[1] & (UTF8_EXTRA_BYTE_MASK - 1)) << (6 * 2));
-                const auto byte3 = static_cast<uint32_t>((view.data[2] & (UTF8_EXTRA_BYTE_MASK - 1)) << 6);
-                const auto byte4 = static_cast<uint32_t>(view.data[3] & (UTF8_EXTRA_BYTE_MASK - 1));
-                return {true, byte1 | byte2 | byte3 | byte4};
-            }
-            else
-            {
-                return {};
-            }
-#undef UTF8_1BYTE_MASK
-#undef UTF8_2BYTES_MASK
-#undef UTF8_3BYTES_MASK
-#undef UTF8_4BYTES_MASK
-#undef UTF8_EXTRA_BYTE_MASK
+        const uint8_t UTF8_1BYTE_MASK      = 1 << 7;
+        const uint8_t UTF8_2BYTES_MASK     = 1 << 5;
+        const uint8_t UTF8_3BYTES_MASK     = 1 << 4;
+        const uint8_t UTF8_4BYTES_MASK     = 1 << 3;
+        const uint8_t UTF8_EXTRA_BYTE_MASK = 1 << 6;
+
+        if (view.count >= 1 &&
+            (*view.data & UTF8_1BYTE_MASK) == 0)
+        {
+            *size = 1;
+            return {true, static_cast<uint32_t>(*view.data)};
+        }
+
+        if (view.count >= 2 &&
+            (view.data[0] & UTF8_2BYTES_MASK) == 0 &&
+            (view.data[1] & UTF8_EXTRA_BYTE_MASK) == 0)
+        {
+            *size = 2;
+            const auto byte1 = static_cast<uint32_t>((view.data[0] & (UTF8_2BYTES_MASK - 1)) << 6);
+            const auto byte2 = static_cast<uint32_t>(view.data[1] & (UTF8_EXTRA_BYTE_MASK - 1));
+            return {true, byte1 | byte2};
+        }
+
+        if (view.count >= 3 &&
+            (view.data[0] & UTF8_3BYTES_MASK) == 0 &&
+            (view.data[1] & UTF8_EXTRA_BYTE_MASK) == 0 &&
+            (view.data[2] & UTF8_EXTRA_BYTE_MASK) == 0)
+        {
+            *size = 3;
+            const auto byte1 = static_cast<uint32_t>((view.data[0] & (UTF8_3BYTES_MASK - 1)) << (6 * 2));
+            const auto byte2 = static_cast<uint32_t>((view.data[1] & (UTF8_EXTRA_BYTE_MASK - 1)) << 6);
+            const auto byte3 = static_cast<uint32_t>(view.data[2] & (UTF8_EXTRA_BYTE_MASK - 1));
+            return {true, byte1 | byte2 | byte3};
+        }
+
+        if (view.count >= 4 &&
+            (view.data[0] & UTF8_4BYTES_MASK) == 0 &&
+            (view.data[1] & UTF8_EXTRA_BYTE_MASK) == 0 &&
+            (view.data[2] & UTF8_EXTRA_BYTE_MASK) == 0 &&
+            (view.data[3] & UTF8_EXTRA_BYTE_MASK) == 0)
+        {
+            *size = 4;
+            const auto byte1 = static_cast<uint32_t>((view.data[0] & (UTF8_3BYTES_MASK - 1)) << (6 * 3));
+            const auto byte2 = static_cast<uint32_t>((view.data[1] & (UTF8_EXTRA_BYTE_MASK - 1)) << (6 * 2));
+            const auto byte3 = static_cast<uint32_t>((view.data[2] & (UTF8_EXTRA_BYTE_MASK - 1)) << 6);
+            const auto byte4 = static_cast<uint32_t>(view.data[3] & (UTF8_EXTRA_BYTE_MASK - 1));
+            return {true, byte1 | byte2 | byte3 | byte4};
+        }
+
+        return {};
     }
 }
 

+ 0 - 2
src/vodus.cpp

@@ -30,8 +30,6 @@ using namespace aids;
 #include <smmintrin.h>
 #endif // VODUS_SSE
 
-const size_t VODUS_MESSAGES_CAPACITY = 1024;
-
 // PLEASE READ THIS --> https://en.wikipedia.org/wiki/Single_Compilation_Unit
 #include "./vodus_error.cpp"
 #include "./vodus_queue.cpp"

+ 2 - 2
src/vodus_main.cpp

@@ -143,9 +143,9 @@ int main(int argc, char *argv[])
         abort();
     }
 
-    Message *messages = new Message[VODUS_MESSAGES_CAPACITY];
+    Message *messages = nullptr;
+    size_t messages_size = parse_messages_from_string_view(input.unwrap, &messages, params);
     defer(delete[] messages);
-    size_t messages_size = parse_messages_from_string_view(input.unwrap, messages, params);
 
     Encoder encoder = {};
     switch (params.output_type) {

+ 14 - 8
src/vodus_message.cpp

@@ -202,19 +202,25 @@ String_View chop_nickname(String_View *input)
     return input->chop_by_delim('>');
 }
 
-size_t parse_messages_from_string_view(String_View input, Message *messages, Video_Params params)
+size_t parse_messages_from_string_view(String_View input, Message **messages, Video_Params params)
 {
+    size_t expected_messages_size = input.count_chars('\n') + 1;
+    if (params.messages_limit.has_value) {
+        expected_messages_size = min(expected_messages_size, params.messages_limit.unwrap);
+    }
+
+    *messages = new Message[expected_messages_size];
+
     size_t messages_size = 0;
-    while (input.count > 0) {
-        assert(messages_size < VODUS_MESSAGES_CAPACITY);
+    while (input.count > 0 && messages_size < expected_messages_size) {
         String_View message = input.chop_by_delim('\n');
-        messages[messages_size].timestamp = (int) chop_timestamp(&message);
-        messages[messages_size].nickname = chop_nickname(&message);
-        messages[messages_size].message = message.trim();
+        (*messages)[messages_size].timestamp = (int) chop_timestamp(&message);
+        (*messages)[messages_size].nickname = chop_nickname(&message);
+        (*messages)[messages_size].message = message.trim();
         messages_size++;
     }
-    messages_size = min(messages_size, params.messages_limit);
-    std::sort(messages, messages + messages_size,
+
+    std::sort(*messages, *messages + messages_size,
               [](const Message &m1, const Message &m2) {
                   return m1.timestamp < m2.timestamp;
               });

+ 2 - 2
src/vodus_video_params.cpp

@@ -50,7 +50,7 @@ Video_Params default_video_params() {
     params.text_color        = {200, 200, 200, 255};
     params.bitrate           = 400'000;
     params.font              = ""_sv;
-    params.messages_limit     = VODUS_MESSAGES_CAPACITY;
+    params.messages_limit    = {};
     return params;
 }
 
@@ -142,7 +142,7 @@ void patch_video_params_from_flag(Video_Params *params, String_View flag, String
     } else if (flag == "font"_sv) {
         params->font = value;
     } else if (flag == "messages_limit"_sv || flag == "messages-limit"_sv) {
-        params->messages_limit = parse_integer_flag<size_t>(flag, value);
+        params->messages_limit = {true, parse_integer_flag<size_t>(flag, value)};
     } else if (flag == "output_type"_sv || flag == "output-type"_sv) {
         if (value == "video"_sv) {
             params->output_type = Output_Type::Video;

+ 1 - 1
src/vodus_video_params.hpp

@@ -19,7 +19,7 @@ struct Video_Params
     Pixel32 text_color;
     int bitrate;
     String_View font;
-    size_t messages_limit;
+    Maybe<size_t> messages_limit;
 };
 
 void print1(FILE *stream, Video_Params params);

+ 0 - 1
video.conf

@@ -3,5 +3,4 @@ font_size = 46
 fps = 30
 width = 704
 height = 576
-messages_limit = 20
 bitrate = 6000000