public static void CreateCttm(string emFilePath, string srcPath, string outputPath)
        {
            EmmaBinaryReader cebre = new EmmaBinaryReader(emFilePath);
            MetaDataDescriptor cedata = (MetaDataDescriptor)LoadEmmaFile(cebre);
            cebre.Close();
            Report.ReportDataModel current = new Report.ReportDataModel();
            Report.RootItem croot = current.CreateViewForDiff(cedata, srcPath);

            FileStream fs = new FileStream(outputPath, FileMode.OpenOrCreate);
            BinaryFormatter bf = new BinaryFormatter();
            bf.Serialize(fs, current);
            fs.Close();
            fs.Dispose();
        }
        public DiffItem Compare(ReportDataModel oldReportData)
        {
            HashSet<int> currentHash = new HashSet<int>();
            HashSet<int> currentHashForExpect = new HashSet<int>();
            HashSet<int> previousHash = new HashSet<int>();

            Dictionary<int, Dictionary<string, BlockItem>> currentBlocks = new Dictionary<int, Dictionary<string, BlockItem>>();
            Dictionary<int, Dictionary<string, BlockItem>> previousBlocks = new Dictionary<int, Dictionary<string, BlockItem>>();
            foreach (string key in oldReportData.ClassMap.Keys)
            {
                if (m_classMap.ContainsKey(key) && oldReportData.ClassMap[key].HashCode == m_classMap[key].HashCode)
                {
                    continue;
                }
                foreach (Item methodItem in oldReportData.ClassMap[key].Children)
                {
                    foreach (Item blockItem in methodItem.Children)
                    {
                        BlockItem block=blockItem as BlockItem;
                        int hash=block.HashCode;
                        previousHash.Add(hash);
                        if (!previousBlocks.ContainsKey(hash))
                        {
                            Dictionary<string, BlockItem> previousBlockMap = new Dictionary<string, BlockItem>();
                            previousBlockMap.Add(block.Name, block);
                            previousBlocks.Add(hash, previousBlockMap);
                        }
                        else
                        {
                            if (!previousBlocks[hash].ContainsKey(block.Name))
                            {
                                previousBlocks[hash].Add(block.Name, block);
                            }
                        }
                    }
                }
            }

            foreach (string key in m_classMap.Keys)
            {
                if (oldReportData.ClassMap.ContainsKey(key) && oldReportData.ClassMap[key].HashCode == m_classMap[key].HashCode)
                {
                    continue;
                }
                foreach (Item methodItem in m_classMap[key].Children)
                {
                    foreach (Item blockItem in methodItem.Children)
                    {
                        BlockItem block = blockItem as BlockItem;
                        int hash = block.HashCode;
                        currentHash.Add(hash);
                        currentHashForExpect.Add(hash);
                        if (!currentBlocks.ContainsKey(hash))
                        {
                            Dictionary<string, BlockItem> currentBlockMap = new Dictionary<string, BlockItem>();
                            currentBlockMap.Add(block.Name, block);
                            currentBlocks.Add(hash, currentBlockMap);
                        }
                        else
                        {
                            if (!currentBlocks[hash].ContainsKey(block.Name))
                            {
                                currentBlocks[hash].Add(block.Name, block);
                            }
                        }
                    }
                }
            }

            currentHash.ExceptWith(previousHash);
            previousHash.ExceptWith(currentHashForExpect);

            DiffItem diffItem = new DiffItem();

            foreach (int i in currentHash)
            {
                foreach (BlockItem item in currentBlocks[i].Values)
                {
                    diffItem.AddedBlocks.Add(item);
                }
            }

            foreach (int i in previousHash)
            {
                foreach (BlockItem item in previousBlocks[i].Values)
                {
                    diffItem.ReducedBlocks.Add(item);
                }
            }

            return diffItem;
        }
        private static ReportDataModel CreateModuleForCttr(string emFilePath, CttCaseCollection ecFilesPaths, string srcPath)
        {
            EmmaBinaryReader ebre = new EmmaBinaryReader(emFilePath);
            MetaDataDescriptor edata = (MetaDataDescriptor)LoadEmmaFile(ebre);
            ebre.Close();
            CaseCoverageDescriptor ccdata = new CaseCoverageDescriptor();

            foreach (CttCase cttCase in ecFilesPaths.CoverageFilePaths)
            {
                EmmaBinaryReader ebrc = new EmmaBinaryReader(cttCase.ResultPath);
                CoverageDataDescriptor cdata = (CoverageDataDescriptor)LoadEmmaFile(ebrc);
                ebrc.Close();

                ccdata.MergeCaseCoverageData(cdata, cttCase.CaseId);
            }

            ReportDataModel previous = new Report.ReportDataModel();
            RootItem root = previous.CreateViewForCaseCoverage(edata, ccdata, srcPath);
            return previous;
        }