code_size_compare: add a base class as CodeSizeGenerator

Signed-off-by: Yanray Wang <yanray.wang@arm.com>
diff --git a/scripts/code_size_compare.py b/scripts/code_size_compare.py
index 3c0f83d..a5625c3 100755
--- a/scripts/code_size_compare.py
+++ b/scripts/code_size_compare.py
@@ -126,7 +126,44 @@
             sys.exit(1)
 
 
-class CodeSizeGeneratorWithSize:
+class CodeSizeGenerator:
+    """ A generator based on size measurement tool for library objects.
+
+    This is an abstract class. To use it, derive a class that implements
+    size_generator_write_record and size_generator_write_comparison methods,
+    then call both of them with proper arguments.
+    """
+    def size_generator_write_record(
+            self,
+            revision: str,
+            code_size_text: typing.Dict,
+            output_file: str
+    ) -> None:
+        """Write size record into a file.
+
+        revision: Git revision.(E.g: commit)
+        code_size_text: text output (utf-8) from code size measurement tool.
+        output_file: file which the code size record is written to.
+        """
+        raise NotImplementedError
+
+    def size_generator_write_comparison(
+            self,
+            old_rev: str,
+            new_rev: str,
+            output_stream
+    ) -> None:
+        """Write a comparision result into a stream between two revisions.
+
+        old_rev: old git revision to compared with.
+        new_rev: new git revision to compared with.
+        output_stream: stream which the code size record is written to.
+                       (E.g: file / sys.stdout)
+        """
+        raise NotImplementedError
+
+
+class CodeSizeGeneratorWithSize(CodeSizeGenerator):
     """Code Size Base Class for size record saving and writing."""
 
     class SizeEntry: # pylint: disable=too-few-public-methods
@@ -249,6 +286,31 @@
             else:
                 output.write("{} {}\n".format(fname, new_size))
 
+    def size_generator_write_record(
+            self,
+            revision: str,
+            code_size_text: typing.Dict,
+            output_file: str
+    ) -> None:
+        """Write size record into a specified file based on Git revision and
+        output from `size` tool."""
+        for mod, size_text in code_size_text.items():
+            self.set_size_record(revision, mod, size_text)
+
+        print("Generating code size csv for", revision)
+        output = open(output_file, "w")
+        self.write_size_record(revision, output)
+
+    def size_generator_write_comparison(
+            self,
+            old_rev: str,
+            new_rev: str,
+            output_stream
+    ) -> None:
+        """Write a comparision result into a stream between two revisions."""
+        output = open(output_stream, "w")
+        self.write_comparison(old_rev, new_rev, output)
+
 
 class CodeSizeComparison:
     """Compare code size between two Git revisions."""