PropertyStringTableHeader ReadHeader()
 {
     using (LockRead())
     {
         m_Fs.Seek(0, SeekOrigin.Begin);
         return(PropertyStringTableHeader.FromBinary(m_Br));
     }
 }
        void Create(int stringCount, int averageStringLength = DefaultAverageStringSize)
        {
            var header = new PropertyStringTableHeader();

            header.version     = Version;
            header.count       = 0;
            header.symbolSlots = Math.Max(stringCount * HashFactor, 1);

            var bytesPerString = GetStringByteSize(averageStringLength);

            header.allocatedStringBytes = stringCount * bytesPerString;
            header.usedStringBytes      = StringLengthByteSize;

            var buffer = new byte[Marshal.SizeOf <PropertyStringTableHeader>() + GetSymbolsByteSize(header.symbolSlots) + header.allocatedStringBytes];

            TransactionUtils.SerializeInto(header, buffer, 0);
            using (var fs = File.Open(filePath, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite | FileShare.Delete))
                fs.Write(buffer, 0, buffer.Length);
        }
        void Create(int stringCount, int averageStringLength = DefaultAverageStringSize)
        {
            var header = new PropertyStringTableHeader();

            header.version     = Version;
            header.count       = 0;
            header.symbolSlots = Math.Max(stringCount * HashFactor, 1);

            var bytesPerString = GetStringByteSize(averageStringLength);

            header.allocatedStringBytes = stringCount * bytesPerString;
            header.usedStringBytes      = StringLengthByteSize;

            var buffer = new byte[GetSymbolsByteSize(header.symbolSlots) + header.allocatedStringBytes];

            using (var bw = new BinaryWriter(File.Open(filePath, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite | FileShare.Delete)))
            {
                header.ToBinary(bw);
                bw.Write(buffer);
            }
        }
        public PropertyStringTableView(PropertyStringTable stringTable, bool delayedSync)
        {
            m_StringTable = stringTable;
            m_Disposed    = false;
            m_DelayedSync = delayedSync;

            using (LockRead())
            {
                m_Fs = File.Open(stringTable.filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite | FileShare.Delete);
                m_Br = new BinaryReader(m_Fs, PropertyStringTable.encoding, true);
                m_Bw = new BinaryWriter(m_Fs, PropertyStringTable.encoding, true);
            }
            stringTable.RegisterStringTableChangedHandler(HandleStringTableChanged);

            m_Header = ReadHeader();
            using (LockUpgradeableRead())
            {
                if (m_Header.version != PropertyStringTable.Version)
                {
                    Clear();
                }
            }
        }
        public PropertyStringTableView(PropertyStringTable stringTable, bool delayedSync)
        {
            m_StringTable  = stringTable;
            m_Disposed     = false;
            m_DelayedSync  = delayedSync;
            m_SymbolBuffer = new byte[PropertyStringTable.SymbolByteSize];
            m_StringBuffer = new byte[PropertyStringTable.DefaultAverageStringSize * sizeof(char)];
            m_HeaderBuffer = new byte[Marshal.SizeOf <PropertyStringTableHeader>()];

            using (LockRead())
            {
                m_Fs = File.Open(stringTable.filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite | FileShare.Delete);
            }
            stringTable.RegisterStringTableChangedHandler(HandleStringTableChanged);

            m_Header = ReadHeader();
            using (LockUpgradeableRead())
            {
                if (m_Header.version != PropertyStringTable.Version)
                {
                    Clear();
                }
            }
        }
 void NotifyStringTableChanged(PropertyStringTableHeader newHeader)
 {
     m_StringTable.NotifyStringTableChanged(newHeader);
 }
 void HandleStringTableChanged(PropertyStringTableHeader newHeader)
 {
     using (LockWrite())
         m_Header = newHeader;
 }
 public void NotifyStringTableChanged(PropertyStringTableHeader newHeader)
 {
     using (LockUpgradeableRead())
         m_StringTableChanged?.Invoke(newHeader);
 }