summaryrefslogtreecommitdiff
path: root/src/VBox/Devices/Graphics/HGSMI/HGSMIHostHlp.h
blob: eb76aed915fa9b2be2720e6437c8d63784e343a8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/** @file
 *
 * VBox Host Guest Shared Memory Interface (HGSMI).
 * Host part helpers.
 */

/*
 * Copyright (C) 2006-2010 Oracle Corporation
 *
 * This file is part of VirtualBox Open Source Edition (OSE), as
 * available from http://www.virtualbox.org. This file is free software;
 * you can redistribute it and/or modify it under the terms of the GNU
 * General Public License (GPL) as published by the Free Software
 * Foundation, in version 2 as it comes in the "COPYING" file of the
 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
 */


#ifndef __HGSMIHostHlp_h__
#define __HGSMIHostHlp_h__

#include <iprt/assert.h>
#include <iprt/types.h>

typedef struct _HGSMILISTENTRY
{
    struct _HGSMILISTENTRY *pNext;
} HGSMILISTENTRY;

typedef struct _HGSMILIST
{
    HGSMILISTENTRY *pHead;
    HGSMILISTENTRY *pTail;
} HGSMILIST;

void hgsmiListAppend (HGSMILIST *pList, HGSMILISTENTRY *pEntry);
DECLINLINE(void) hgsmiListPrepend (HGSMILIST *pList, HGSMILISTENTRY *pEntry)
{
    HGSMILISTENTRY * pHead = pList->pHead;
    pList->pHead = pEntry;
    pEntry->pNext = pHead;
    if (!pHead)
        pList->pTail = pEntry;
}

void hgsmiListRemove (HGSMILIST *pList, HGSMILISTENTRY *pEntry, HGSMILISTENTRY *pPrev);

DECLINLINE(HGSMILISTENTRY*) hgsmiListRemoveHead (HGSMILIST *pList)
{
    HGSMILISTENTRY *pHead = pList->pHead;
    if (pHead)
        hgsmiListRemove (pList, pHead, NULL);
    return pHead;
}

DECLINLINE(bool) hgsmiListIsEmpty (HGSMILIST *pList)
{
    return !pList->pHead;
}

DECLINLINE(void) hgsmiListInit (HGSMILIST *pList)
{
    pList->pHead = NULL;
    pList->pTail = NULL;
}

HGSMILISTENTRY * hgsmiListRemoveAll (HGSMILIST *pList, HGSMILISTENTRY ** ppTail /* optional */);

DECLINLINE(void) hgsmiListAppendAll (HGSMILIST *pList, HGSMILISTENTRY *pHead, HGSMILISTENTRY *pTail)
{
    if(hgsmiListIsEmpty (pList))
    {
        pList->pHead = pHead;
        pList->pTail = pTail;
    }
    else
    {
        pList->pTail->pNext = pHead;
        pList->pTail = pTail;
    }
}

DECLINLINE(void) hgsmiListPrependAll (HGSMILIST *pList, HGSMILISTENTRY *pHead, HGSMILISTENTRY *pTail)
{
    HGSMILISTENTRY *pOldHead = pList->pHead;
    if(!pOldHead)
    {
        pList->pHead = pHead;
        pList->pTail = pTail;
    }
    else
    {
        pList->pHead = pHead;
        pTail->pNext = pOldHead;
    }
}

DECLINLINE(void) hgsmiListCat (HGSMILIST *pList, HGSMILIST *pList2)
{
    hgsmiListAppendAll (pList, pList2->pHead, pList2->pTail);
    hgsmiListInit (pList2);
}

DECLINLINE(void) hgsmiListPrepCat (HGSMILIST *pList, HGSMILIST *pList2)
{
    hgsmiListPrependAll (pList, pList2->pHead, pList2->pTail);
    hgsmiListInit (pList2);
}


#endif /* !__HGSMIHostHlp_h__*/