⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 messagestore.cpp

📁 内存受限系统软件开发一书的代码。(虽不及Gang of Four的模式掷地有声
💻 CPP
字号:
 
/* ***************************************************
   Fixed Data Structure Example
   Message Store 
   ***************************************************
   */

#include <iostream.h>
#include <string.h>
#include <stdio.h>
#include <stddef.h>

static void test(char* input[], char* output[], int nMessagesInStore, int maxMsgLength);


int min( int i, int j ) { return i > j ? j: i; }

static void Assert (bool  assertion, char* excuse) {
    if  (!assertion) { 
        cerr << "Assertion failed: " << excuse << endl;  
    }
}

class MessageStore {
private:
    char* messageBuffer;
    int oldestMessageNumber;
    int nMessagesInStore;
    int maxMessageLength;
    int maxMessagesInStore;
    
public:
    MessageStore(int capacity, int maxMsgLength) 
        : maxMessagesInStore( capacity ),
          maxMessageLength( maxMsgLength ),
          oldestMessageNumber( 0 ),
          nMessagesInStore( 0 ) {
            messageBuffer = new char[Capacity() * MessageStructureSize()];
            Assert( NMessagesInStore() == 0, "buffer calcuations wrong" );
        }
    
    void AcceptMessage(const char* newMessageText) {
        int nextMessage = (oldestMessageNumber + NMessagesInStore()) % Capacity();
        int newMessageLength = strlen( newMessageText );
        int nBytesToCopy = min(newMessageLength,maxMessageLength)+1;
        strncpy(MessageAt(nextMessage), newMessageText, nBytesToCopy);
        MessageAt(nextMessage)[maxMessageLength] = '\0';
        if (NMessagesInStore() == Capacity()) { 
            oldestMessageNumber = (oldestMessageNumber + 1) % Capacity();
        } else {
            nMessagesInStore++;
        }
    }

    // GetMessage: Answers a message.  0 returns the oldest.
    const char* GetMessage(int i) {
        int messageIndex = (oldestMessageNumber + i) % Capacity();
        return MessageAt(messageIndex); 
    }

    int NMessagesInStore()      { return nMessagesInStore; }
    int Capacity()              { return maxMessagesInStore; } 
    int MessageStructureSize()  { return maxMessageLength+1; }

private:
    char * MessageAt( int i ) { 
        return messageBuffer + i*MessageStructureSize(); 
    }
};

int main( int argc, char** argv ) {
    char* a = "one string";
    char* b  = "twostring";
    char* c = "threestring";
    char* c1 = "threestrin";
    char* test1input[] = { a, b, c, 0 };
    char* test1output[] = { b, c1, 0 };
    
    test(test1input,test1output,2,10);
    
    test(test1input,test1input, 10, 20);
    //    test(new String[0], new String[0], 10, 20);
    cout << "done!\n";
    cin.get();  cin.get();
    return 0;
}

static void test(char* input[], char* output[], int nMessagesInStore, int maxMsgLength) {
    MessageStore* self= new MessageStore(nMessagesInStore, maxMsgLength);

    int i;
    for ( i=0; input[i]; i++ ){
        self->AcceptMessage(input[i]); 
    }

    for (i=0; output[i]; i++ ) {
        const char* s = self->GetMessage(i);
        Assert ( strcmp(s, output[i]) == 0,  
                 "message wrong");
    }
    Assert( i == self->NMessagesInStore(), "length wrong" );
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -